📊 Агрегатные функции в ClickHouse — это не просто sum и avg
🔥 Главная мысль
Когда говорят “агрегатные функции”, многие вспоминают только:
• sum() • avg() • count()
Но в ClickHouse мир агрегатных функций намного богаче.
И это очень важно, потому что именно агрегаты делают ClickHouse сильным аналитическим движком.
Агрегация — это объединение строк по ключу, где на каждую группу мы получаем одну итоговую строку.
А агрегатные функции — это инструкция, как именно объединять значения внутри этой группы.
🟢 Плюсы:
• можно считать не только сумму и среднее • удобно искать экстремумы, уникальности, квантили • есть агрегаты для реальных аналитических сценариев • есть комбинаторы, которые расширяют поведение функций
Пример плюса: если ты хочешь не просто узнать максимальное время ответа, а понять, когда именно оно было, можно использовать argMax(timestamp, response_time).
🔴 Минусы:
• новички часто знают только базовые агрегаты • без понимания комбинаторов теряется половина силы ClickHouse • можно написать корректный SQL, но получить не ту бизнес-логику • некоторые агрегаты требуют понимания, что именно они возвращают
Пример минуса: человек хочет “95-й перцентиль”, но считает avg(), и получает красивую, но не очень полезную цифру.
🧪 Живые примеры
Полезные агрегатные функции:
• count() — количество строк • uniq(expr) — количество уникальных значений • min() / max() — минимум и максимум • argMin(arg, val) / argMax(arg, val) — значение одного поля из строки с min/max другого поля • quantile(level)(expr) — квантиль, например 0.95 или 0.99
Очень полезная мысль:
argMax(timestamp, response_time) отвечает не на вопрос “какое было максимальное время ответа?”, а на вопрос “в какой момент было максимальное время ответа?”
Это уже сильно ближе к реальной аналитике.
Ещё один важный класс — комбинаторы агрегатных функций.
Например:
• -If • -Array • -Map • -Distinct • -State / -Merge / -MergeState • -Resample(...)
Что это даёт на практике:
• quantileIf(...) — считать квантиль только по нужным строкам • uniqArray(...) — агрегировать массивы • sumDistinct(...) — считать только уникальные значения • State / Merge — работать с промежуточными состояниями агрегации
🏗 Архитектурная мысль
В больших компаниях агрегатные функции — это основа витрин, отчётности и предагрегаций.
Именно они помогают:
• уменьшать объём данных на выходе • превращать raw-события в бизнес-метрики • строить materialized views и агрегированные слои • считать метрики близко к данным, а не после выгрузки
Что это даёт:
• быстрее BI • меньше лишнего трафика • меньше постобработки вне ClickHouse
⚠️ Риски:
• использовать avg там, где нужен quantile • не понимать разницу между max и argMax • игнорировать комбинаторы • тащить агрегатную логику во внешний код, хотя её можно считать в ClickHouse
✅ Вывод
Агрегатные функции в ClickHouse — это не только sum и avg 📈
Это полноценный язык аналитики:
• уникальности • квантили • условные агрегаты • работа с массивами • промежуточные состояния
И чем лучше ты их понимаешь, тем сильнее у тебя становятся витрины и отчёты 🚀