Раздел 42 · Аналитика данных с нуля

Агрегатные функции: COUNT, SUM, AVG, MIN, MAX

junior~15 мин

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

Блок B научил тебя доставать строки: персонажей, офферы, игроков. Отфильтрованные, отсортированные, но всё ещё по одной строке на запись. Бран просит другое: свернуть тысячу строк в одно число. Для этого в SQL есть отдельный инструмент, и с него начинается блок C, где строки превращаются в метрики. А Лада задала вопрос на весь блок: откуда взялась цифра и чему в ней можно верить.

Кассовая лента

В конце смены кассир не пересказывает каждый чек. Он отрывает ленту и смотрит итог: чеков столько-то, денег столько-то, самый крупный чек такой-то. Лента длинная, итог короткий.

Функция, которая делает такой итог, называется агрегатной. Она берёт столбец из многих строк и возвращает одно значение. Пять главных:

ФункцияЧто считаетКассовый аналог
count(*)сколько строксколько чеков
sum(x)сумму значенийсколько денег
avg(x)среднее арифметическоесредний чек
min(x)наименьшее значениесамый маленький чек
max(x)наибольшее значениесамый крупный чек

Одна строка на всю таблицу

Ответим Брану прямо сейчас:

SELECT count(*)        AS purchases,
       sum(amount_rub) AS revenue,
       avg(amount_rub) AS avg_check
FROM purchases;
 purchases | revenue   | avg_check
-----------+-----------+----------------------
      1250 | 726433.00 | 581.1464000000000000

В таблице 1250 строк, а в ответе одна. Агрегатная функция в SELECT без всего остального сворачивает всю таблицу в одну строку итогов. Агрегатов в одном SELECT можно поставить сколько угодно: все они считаются по одному и тому же набору строк.

Средний чек вышел с шестнадцатью знаками после запятой. Брану они не нужны, поэтому округляем, как в уроке про типы:

SELECT round(avg(amount_rub), 2) AS avg_check,
       min(amount_rub)           AS min_check,
       max(amount_rub)           AS max_check
FROM purchases;
 avg_check | min_check | max_check
-----------+-----------+-----------
    581.15 |     99.00 |   4990.00

Самая дешёвая покупка стоит 99 ₽, это «Горсть гемов». Самая дорогая 4990 ₽, «Казна гемов». Средний чек 581,15 ₽.

WHERE работает и тут: сначала отбираются строки, потом по ним считается итог. Например, выручка только с Android:

SELECT sum(amount_rub) AS android_revenue
FROM purchases
WHERE platform = 'android';
 android_revenue
-----------------
       317275.00

min и max умеют не только числа. На датах они дают самую раннюю и самую позднюю, на тексте первую и последнюю по алфавиту. min(registered_at) в таблице players покажет день первой регистрации.

урок из курса

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

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