Раздел 38 · ClickHouse и аналитические базы

Агрегатные комбинаторы: -If, -Array, -State/-Merge

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы собрали отчёт из готовых агрегатных функций. В ClickHouse их можно ещё и достраивать: дописал к имени функции суффикс, и она стала считать по-другому. Эти суффиксы называются комбинаторами. Разберём три самых нужных.

-If: считать по условию

Продуктовая команда хочет воронку: сколько раз приложение открывали, искали, заказывали и платили, по каждой платформе. В PostgreSQL пришлось бы писать count(*) FILTER (WHERE kind = 'open') или sum(CASE WHEN ... THEN 1 ELSE 0 END) на каждый шаг.

В ClickHouse к любой агрегатной функции можно приписать If и добавить условие последним аргументом:

SELECT
    platform,
    countIf(kind = 'open') AS opens,
    countIf(kind = 'search') AS searches,
    countIf(kind = 'order') AS orders,
    countIf(kind = 'pay') AS payments
FROM events
GROUP BY platform;

Работает с любой функцией: sumIf(price_rub, status = 'delivered'), avgIf(distance_km, zone_id = 1), uniqIf(user_id, kind = 'pay'). Один проход по таблице считает сразу все шаги воронки. Это быстрее, чем четыре отдельных запроса, и проще, чем подзапросы.

-Array: по элементам массива

Если колонка хранит массив, комбинатор Array применит функцию ко всем элементам всех массивов: sumArray(items) сложит все элементы, uniqArray(tags) посчитает разные теги во всех строках. Пример:

SELECT sumArray([1, 2, 3]), uniqArray(['a', 'b', 'a']);

Вернёт 6 и 2. Комбинаторы можно склеивать: countIfArray или sumArrayIf тоже существуют, хотя в работе встречаются редко.

урок из курса

Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.