Добро пожаловать в четвертую статью нашего курса по ClickHouse! В прошлый раз мы научились основам: вставлять, выбирать и агрегировать данные. Теперь, когда вы можете получать базовую статистику, пришло время углубить свои навыки и научиться «разговаривать» с данными на более сложном языке.
Сегодня мы изучим мощные инструменты, которые позволят вам преобразовывать, форматировать и анализировать данные на совершенно новом уровне. Мы разберем функции для работы со строками, датами и временем, а также освоим условную логику, которая сделает ваши запросы по-настоящему гибкими.
Манипуляции со строками: извлекаем смысл из текста
Текстовые данные, такие как URL, имена, описания или логи, часто требуют предварительной обработки. ClickHouse предлагает богатый набор функций для этого.
- Конкатенация:
concat(s1, s2, ...)— объединяет несколько строк в одну. - Длина строки:
length(s)— возвращает количество символов в строке. - Изменение регистра:
lower(s),upper(s)— приводят строку к нижнему или верхнему регистру. - Извлечение подстроки:
substring(s, offset, length)— вырезает часть строки. - Поиск и замена:
position(haystack, needle)(находит позицию подстроки),replace(haystack, needle, replacement)(заменяет подстроку). - Поиск по шаблону: LIKE (простой поиск по шаблону с
%и_), multiSearchAny(haystack, [needle1, needle2, …]) (эффективный поиск любой из нескольких подстрок).
Практический пример: Давайте из нашей таблицы access_logs извлечем доменное имя из поля ip_address (для примера представим, что это домен) и создадим читаемое описание события.
SELECT
user_id,
url,
concat('Event type "', event_type, '" on page ', url) AS event_description,
substring(ip_address, 1, position(ip_address, '.') - 1) AS first_ip_segment
FROM
my_first_db.access_logs
WHERE
ip_address = '192.168.1.1'
LIMIT 5;
Построение DWH на ClickHouse
Код курса
CLICH
Ближайшая дата курса
15 декабря, 2025
Продолжительность
24 ак.часов
Стоимость обучения
72 000
Работа с датой и временем: точность — ключ к аналитике
Аналитика временных рядов — одна из главных задач ClickHouse. Поэтому функции для работы с датами и временем здесь особенно мощные и оптимизированные.
- Текущее время:
now()— возвращает текущее время сервера. - Форматирование:
formatDateTime(datetime, format)— преобразует дату в строку заданного формата (например,%Y-%m-%d %H:%M:%S). - Извлечение компонентов:
toYear(date),toMonth(date),toDayOfWeek(date),toHour(datetime). - Округление:
toStartOfDay(datetime),toStartOfWeek(datetime),toStartOfMonth(datetime)— очень полезные функции для группировки по дням, неделям или месяцам. - Арифметика:
date_add(unit, value, date),date_diff(unit, start_date, end_date)— позволяют прибавлять или вычитать временные интервалы.
Практический пример: Посчитаем количество событий по дням недели.
SELECT
toDayOfWeek(timestamp) AS day_of_week,
count() AS event_count
FROM
my_first_db.access_logs
GROUP BY
day_of_week
ORDER BY
day_of_week;
Условная логика: CASE WHEN
Конструкция CASE ... WHEN ... THEN ... ELSE ... END — это один из самых полезных инструментов в SQL. Она позволяет применять логику «если-то-иначе» прямо внутри запроса, создавая новые, вычисляемые столбцы на лету. Это идеально подходит для сегментации данных.
Практический пример: Разделим все события в нашей таблице access_logs на категории в зависимости от их продолжительности.
SELECT
user_id,
duration_ms,
CASE
WHEN duration_ms > 400 THEN 'Very Long'
WHEN duration_ms > 150 AND duration_ms <= 400 THEN 'Normal'
ELSE 'Short'
END AS duration_category
FROM
my_first_db.access_logs
LIMIT 10;
Краткий взгляд на подзапросы
Подзапрос — это SELECT запрос, вложенный в другой запрос. Они позволяют создавать более сложные выборки. Например, можно выбрать всех пользователей, которые совершили определенное событие.
Практический пример: Найдем все события пользователей, которые хотя бы раз заходили на страницу /contact.
SELECT
timestamp,
user_id,
event_type,
url
FROM
my_first_db.access_logs
WHERE
user_id IN (
SELECT DISTINCT user_id
FROM my_first_db.access_logs
WHERE url = '/contact'
);
Внутренний запрос сначала находит всех уникальных пользователей (DISTINCT user_id), посетивших страницу /contact, а внешний запрос затем выбирает все события для этих пользователей.
Заключение
Вы освоили еще один мощный пласт инструментов в ClickHouse. Функции для работы со строками, датами и условная логика превращают простые запросы в гибкий инструмент для глубокого анализа данных. Теперь вы можете не просто агрегировать данные, но и очищать их, обогащать и сегментировать прямо на лету.
В следующей статье мы вернемся к архитектуре и сделаем глубокое погружение в семейство движков MergeTree.
Использованные референсы и материалы
- Официальная документация по функциям ClickHouse SQL: https://clickhouse.com/docs/en/sql-reference/functions
- Статья о CASE в SQL https://www.geeksforgeeks.org/sql/sql-case-statement/
- Под капотом PREWHERE в ClickHouse: сравниваем планы запросов





