Блок 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.