Введение
В мире данных часто требуется не просто извлечь информацию, но и обобщить ее: посчитать общее количество записей, вычислить среднее значение или сумму этих значений, найти максимум или минимум. Именно для этого в SQL существуют агрегатные функции — специальные функции, которые обрабатывают набор значений и возвращают единственный результат для указанной группы полей.
В этой статье мы разберем, что такое агрегатные функции, как они работают и где применяются. Рассмотрим основные функции: COUNT
, SUM
, AVG
, MAX
, MIN
, а также их комбинации. Узнаем, как группировать данные с помощью GROUP BY
и фильтровать агрегированные результаты с помощью HAVING
в рамках единого запроса. В конце приведем практические примеры для закрепления материала.
Что такое агрегатная функция в SQL
Агрегатная функция — это операция, которая принимает множество значений (например, все числа в столбце) и возвращает одно вычисленное значение.
Основные особенности:
- Работают с наборами данных (столбцами или выражениями).
- Игнорируют
NULL
(кромеCOUNT()
). - Используются вместе с
GROUP BY
для групповой обработки.
Без агрегатных функций пришлось бы выгружать все строки и считать вручную, что неэффективно.
Для чего используются агрегатные функции
Основные задачи агрегатных функций:
- Анализ данных (например, расчет средних продаж или общей выручки).
- Фильтрация (выбор групп, где сумма больше заданного значения).
- Оптимизация (агрегация на стороне БД, а не в отчете).
Пример: вместо выгрузки всех заказов можно сразу получить их общее количество и сумму по группам товаров и месяцам.
Функция COUNT
Считает количество строк или не-NULL значений. Чаще всего применяется для калькуляции числа клиентов, остатков, строк (при валидации таблиц).
Синтаксис:
SELECT поле (одно или несколько), COUNT(по полю) FROM table
GROUP BY поле (одно или несколько)
Если нужно просто посчитать количество строк в таблице, то синтаксис будет выглядеть упрощенным:
SELECT COUNT(*) FROM table
Примеры:
- Количество заказов по месяцам:
SELECT month, COUNT(order_id) FROM orders
GROUP BY month
- Количество уникальных пользователей, купивших продукт в 2024 году:
Важно:COUNT()
считает все строки, включаяNULL
, аCOUNT(column)
— только не-NULL
значения.
Также внутри COUNT
можно использовать DISTINCT
, которые уникализирует данные.
SELECT month, product, COUNT(distinct client_uk) FROM clients
WHERE month >= ‘2024-01-01’
GROUP BY month, product
Функция SUM
Суммирует значения в столбце. Обычно используется для суммирования продаж, размеров транзакций,
Синтаксис:
SELECT SUM(по полю) FROM table
Пример:
Общая выручка за 2024 год:
SELECT SUM(revenue) as total_revenue FROM sales
WHERE 1 = 1
AND DATE >= ‘2024-01-01’
AND DATE < ‘2025-01-01’
Особенности:
- Игнорирует
NULL
. - Работает только с числами.
Функция AVG
Вычисляет среднее арифметическое значение.
Синтаксис:
SELECT AVG(по полю) FROM table
Пример:
Средний чек в магазине за 2024 год:
SELECT AVG(RUR_AMT) as avg_bill FROM transactions
WHERE 1 = 1
AND DATE >= ‘2024-01-01’
AND DATE < ‘2025-01-01’
Нюансы:
NULL
не учитывается.- Для точности можно использовать
CAST:
SELECT CAST(AVG(RUR_AMT) as FLOAT) as avg_bill FROM transactions
WHERE 1 = 1
AND DATE >= ‘2024-01-01’
AND DATE < ‘2025-01-01’
Функции MAX и MIN
Находят максимальное и минимальное значение в столбце. Основываясь на своем опыте, чаще всего применяются для поиска максимальной и минимальной даты, но можно использовать и для других целей, например для выявления границ выборки.
Синтаксис:
SELECT MIN(по полю), MAX(по полю) from table
Пример:
Самый дорогой и дешевый товар:
SELECT MAX(price) as max_price, MIN(price) as min_price from items
Применение:
- Анализ диапазонов (цена, даты, возраст).
- Поиск экстремальных значений.
Комбинирование функций
Агрегатные функции можно сочетать в одном запросе. Например, для расчета количества продаж можно посчитать количество уникальных клиентов, количество продаж и средний чек.
Пример:
Статистика по заказам:
SELECT
Period,
COUNT(DISTINCT client_uk) as cl_dis,
SUM(sale_flag) as sales,
AVG(RUR_AMT) as avg_bill
FROM orders
WHERE period >= ‘2025-01-01’
GROUP BY period
Использование GROUP BY
GROUP BY
группирует данные перед применением агрегатных функций. То есть, простыми словами, GROUP BY
позволяет вам агрегировать данные по определенному значению поля. Например, у вас есть три вида фруктов (бананы, яблоки и груши), которые хранятся на 10 складах. Вам нужно посчитать общие остатки каждого фрукта на складах. Для этого мы убираем поле с наименование склада и группируем данные по полю, где указано наименование фруктов:
SELECT fruit, sum(fruit_cnt) as cnt FROM remains
GROUP BY fruit
Пример:
Выручка по странам:
SELECT country_name, SUM(revenue) as revenue FROM county_sales
GROUP BY country_name
Важно:
- В
SELECT
можно включать только агрегатные функции или столбцы изGROUP BY.
- Порядок группировки:
GROUP BY
→ агрегация.
Использование HAVING
HAVING
фильтрует результаты после агрегации (в отличие от WHERE
).
Пример:
Страны с выручкой больше 1 млн:
SELECT country_name, SUM(revenue) as revenue FROM county_sales
Where date >= ‘2024-01-01’
GROUP BY country_name
HAVING SUM(revenue) > 1000000
Отличие от WHERE
:
WHERE
фильтрует до агрегации.HAVING
— после.
Агрегатные оконные функции
Оконные функции (OVER
) позволяют применять агрегацию без свертки строк.
Пример:
Сумма продаж по продуктам с накоплением:
SELECT
date,
product,
SUM(sales) OVER(PARTITION BY product ORDER BY date) as running_total
FROM sales
Ключевые возможности:
PARTITION BY
— аналогGROUP BY
внутри окна.ORDER BY
— порядок вычислений.
Примеры
- Количество пользователей по городам:
SELECT city, count(clinet_uk) as cnt FROM users
GROUP BY city
- Средний возраст клиентов по статусу:
SELECT status, AVG(age) as avg_age FROM customers
GROUP BY status
- Топ-5 товаров по продажам:
SELECT
product,
SUM(sales) as sales
FROM sales
WHERE date >= ‘2025-01-01’
GROUP BY product
ORDER BY sales DESC
LIMIT 5;
Заключение
Агрегатные функции — мощный инструмент для анализа данных в SQL.
Они позволяют:
- Считать количество, сумму, среднее, максимум и минимум.
- Группировать данные с
GROUP BY
. - Фильтровать агрегированные результаты через
HAVING
. - Использовать оконные функции для сложных расчетов.
Советы по оптимизации:
- Фильтруйте данные
WHERE
до агрегации. - Используйте индексы для столбцов в
GROUP BY
. - Для больших таблиц применяйте приблизительные агрегаты (например,
APPROX_COUNT_DISTINCT
).
Освоив агрегатные функции, вы сможете легко строить отчеты, анализировать метрики и оптимизировать запросы.