Часть 4 учебника SQL. Агрегатные функции (COUNT, SUM, AVG, MIN, MAX). GROUP BY для группировки данных. HAVING для фильтра агрегатов. Реальные примеры.
TL;DR: Агрегатные функции — COUNT (сколько), SUM (сумма), AVG (среднее), MIN/MAX (минимум/максимум). GROUP BY группирует строки по колонке, агрегаты считаются внутри каждой группы. HAVING фильтрует группы (как WHERE для агрегатов). 90% метрик аналитика — это GROUP BY + агрегаты.
В этой части:
| Функция | Что считает | Пример |
|---|---|---|
COUNT(*) | Количество строк | COUNT(*) AS orders |
COUNT(col) | Количество не-NULL значений | COUNT(email) |
COUNT(DISTINCT col) | Уникальных значений | COUNT(DISTINCT user_id) |
SUM(col) | Сумма | SUM(amount) AS revenue |
AVG(col) | Среднее | AVG(amount) AS avg_check |
MIN(col) / MAX(col) | Минимум / Максимум | MAX(created_at) |
GROUP BY группирует строки по значению колонки. Внутри каждой группы вычисляются агрегаты.
Анимация — следи как строки переходят в свои группы:
Идея:
Правило: каждая колонка в SELECT должна быть либо в GROUP BY, либо внутри агрегата.
WHERE фильтрует строки до агрегацииHAVING фильтрует группы после агрегацииПример:
COUNT(*) — все строки (включая с NULL)COUNT(col) — только строки где col не NULLCOUNT(DISTINCT col) — уникальные не-NULL значенияSUM(amount) GROUP BY countryCOUNT(DISTINCT user_id) GROUP BY DATE(event_ts)AVG(amount) GROUP BY categoryCOUNT(*) GROUP BY product_id ORDER BY COUNT(*) DESC LIMIT 10MAX(created_at) GROUP BY user_idCOUNT(CASE WHEN paid = TRUE THEN 1 END) * 100.0 / COUNT(*) GROUP BY channel(CASE WHEN разберём в Части 7).
Типичные топ-5 запросов: (1) выручка/день, (2) DAU, (3) средний чек по категориям, (4) топ-10 продуктов, (5) конверсия по каналам.