ClickHouse обучение: задачи и практика SQL
ClickHouse обучение проще строить вокруг запросов, которые используют особенности самого ClickHouse. Здесь можно разбирать условные агрегаты, оконные функции и другие конструкции, а затем закреплять их на задачах.
Обновлено · Команда SQL Arena
Что потренируете
- Считать метрики через countIf, sumIf и uniq без лишних CASE
- Группировать события по дням и часам функциями ClickHouse
- Работать с массивами и функциями для Array
- Разбирать агрегаты вроде argMax на прикладных примерах
- Проверять запросы в отдельной ClickHouse-песочнице прямо в браузере
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
В таблице product_events хранятся события по товарам. Для каждого товара, у которого была хотя бы одна покупка, выведите product_id, число просмотров views и число покупок purchases. Отсортируйте результат по product_id.
SELECT product_id, countIf(event_type = 'view') AS views, countIf(event_type = 'purchase') AS purchases FROM product_events GROUP BY product_id HAVING purchases > 0 ORDER BY product_id;
| # | product_id | views | purchases |
|---|---|---|---|
| 1 | 1 | 2 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 4 | 1 | 2 |
В таблице product_events хранятся события по товарам. Для каждого товара, у которого была хотя бы одна покупка, выведите product_id, число просмотров views и число покупок purchases. Отсортируйте результат по product_id.
SELECT product_id, countIf(event_type = 'view') AS views, countIf(event_type = 'purchase') AS purchases FROM product_events GROUP BY product_id HAVING purchases > 0 ORDER BY product_id;
Разбор запроса ClickHouse SQL на примере
Здесь удобно не строить отдельный CASE для каждого типа события, а использовать комбинатор countIf. Выражение countIf(event_type = 'view') считает только строки, где условие истинно, а второй countIf делает то же для покупок. Для событийных таблиц это характерный приём ClickHouse: условие становится частью агрегатной функции, а запрос остаётся коротким.
GROUP BY product_id собирает все события одного товара в одну строку результата. После группировки появляются две независимые метрики — views и purchases. Тот же подход легко расширить: sumIf пригодится для условной суммы, uniq — для числа уникальных пользователей, а argMax — когда нужно вернуть значение, связанное с максимальным временем или другой метрикой.
HAVING purchases > 0 применяется после агрегации и оставляет только товары, у которых была покупка. WHERE event_type = 'purchase' здесь дал бы другой результат: строки с просмотрами исчезли бы ещё до подсчёта, и views стал бы равен нулю или вообще потерял смысл. ORDER BY product_id задаёт однозначный порядок строк.
Курсы по ClickHouse обычно начинают с базовых SELECT, фильтрации и агрегаций, но для уверенной работы важно отдельно освоить особенности диалекта. Например, условные агрегаты countIf и sumIf позволяют включать условие прямо в агрегатную функцию. Оконные функции ClickHouse решают другую задачу: они вычисляют значения по группе строк, не сворачивая её в одну строку, как GROUP BY. С их помощью удобно строить рейтинги, считать накопительные показатели, сравнивать строку с предыдущей и выбирать первое или последнее событие внутри группы.
SELECT product_id, countIf(event_type = 'view') AS views, countIf(event_type = 'purchase') AS purchases FROM product_events GROUP BY product_id HAVING purchases > 0 ORDER BY product_id;
| product_id | views | purchases |
|---|---|---|
| 1 | 2 | 1 |
| 2 | 1 | 2 |
| 4 | 1 | 2 |
Типичные ошибки в задачах ClickHouse
Фильтровать покупки в WHERE
Если оставить только purchase-события до GROUP BY, запрос больше не видит просмотры. Для нескольких метрик по разным условиям лучше использовать countIf или sumIf, а уже готовые группы фильтровать через HAVING.
Писать только универсальный SQL
Обычные CASE WHEN и COUNT могут решить часть задач, но такая практика почти не знакомит с самим ClickHouse. В этом диалекте стоит отдельно отрабатывать countIf, sumIf, uniq, argMax, функции массивов и функции работы со временем.
Не задавать порядок результата
GROUP BY не гарантирует, в каком порядке вернутся строки. Без ORDER BY один и тот же правильный набор данных может выглядеть по-разному, поэтому в учебных задачах и отчётных запросах порядок лучше задавать явно.
Задачи по теме в тренажёре
Курс ClickHouseПосле этого примера можно переходить к задачам про события по дням и часовым бакетам, активность пользователей, зрителей товаров и массивы товаров. Например, бесплатные задачи на просмотры и покупки помогают закрепить условные агрегаты, а дальше появляются более сложные выборки с уникальными пользователями и массивами. В SQL Arena у ClickHouse отдельная песочница: запрос выполняется прямо в браузере, устанавливать СУБД локально не нужно. Ответ проверяется не только на тех строках, которые видны в условии, а на скрытых данных, поэтому запрос должен решать задачу в общем виде. Всего в тренажёре 1 192 задачи, причём у каждой задачи свои таблицы. На бесплатном тарифе без карты доступны 292 задачи на всех четырёх диалектах. Для ClickHouse есть отдельный трек и Курс ClickHouse: в курсе теория сопровождается задачами внутри уроков, а первые главы доступны бесплатно. Когда запрос становится сложнее, можно посмотреть EXPLAIN или открыть ER-диаграмму схемы. AI-ментор умеет давать подсказки и объяснять ошибки; бесплатно доступны 10 таких обращений. Для проверки себя без подсказок есть режим «Собеседование» с серверным таймером и отчётом после сессии, бесплатно — одна попытка в день.
- EasyбесплатноПросмотры и покупки по товаруclickhouse
- EasyбесплатноАктивность пользователя: просмотры и покупкиclickhouse
- EasyбесплатноСобытия по дням (ClickHouse)clickhouse
- EasyбесплатноСобытия по часовым бакетам (ClickHouse)clickhouse
- MediumPremiumМассив товаров пользователя (ClickHouse)clickhouse
- MediumPremiumЗрители каждого товараclickhouse
- MediumPremiumВсе события и число уникальных товаровclickhouse
- MediumPremiumПокупатели товара и их числоclickhouse
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Как проходит обучение ClickHouse?
Начать стоит с базового SQL, а затем перейти к особенностям ClickHouse: условным агрегатам, работе с датой и временем, массивам, оконным функциям и специализированным функциям. Лучше сразу закреплять каждую конструкцию небольшими запросами, а не ограничиваться чтением синтаксиса.
Какие курсы по ClickHouse нужны начинающему?
Полезен курс, который сочетает SQL-основы с конструкциями, характерными именно для ClickHouse. В программу стоит включить агрегаты, функции семейства If, работу с массивами, временными данными, оконными функциями и разбор реальных запросов.
Как работают оконные функции ClickHouse?
Оконная функция вычисляет значение по набору строк, определённому секцией OVER, но не объединяет эти строки в одну. Через PARTITION BY задают группы, через ORDER BY — порядок внутри них, а функции ROW_NUMBER, RANK, SUM и другие выполняют вычисление по окну.
Где решать ClickHouse задачи?
Для практики подходят задачи, где запрос выполняется именно в ClickHouse, а не в другом SQL-диалекте. Так можно привыкнуть к синтаксису, функциям и поведению ClickHouse на разных типах данных.
Практика ClickHouse: задачи для самостоятельного решения
Откройте ClickHouse-песочницу, начните с бесплатных Easy-задач и переходите к треку или Курсу ClickHouse, когда понадобится последовательная практика.
Решать задачи ClickHouse