Зарегистрируйтесь, чтобы продолжить обучение

SUM, COUNT и AVG SQL: Оконные функции

Функции SUM(), COUNT(), AVG() в SQL используются для агрегации данных в столбцах таблицы. В оконных версиях, эти функции вычислят значения в пределах указанного окна, группы.

Например, обычный подсчет среднего и суммы по регионам будет выглядеть так:

SELECT
    sh.region,
    SUM(s.price * s.quantity) AS sum_value,
    AVG(s.price * s.quantity) AS avg_value
FROM sales AS s
LEFT JOIN customer AS c ON s.customer_id = c.customer_id
LEFT JOIN shop AS sh ON s.shop_id = sh.shop_id
GROUP BY sh.region;
region sum_value avg_value
Moscow 106 2.8648648648648649
Vladivostok 19 3.1666666666666667
Saint-Petersburg 75 3.2608695652173913
Kaliningrad 36 3.6000000000000000
Tver 28 4.0000000000000000
Novosibirsk 53 3.1176470588235294

View on DB Fiddle

Проблема запроса выше, что мы не можем сравнить значение строки с расчитанным средним или суммой. В таком случае, нам помогут оконные функции:

SELECT
    id,
    sale_date,
    price,
    quantity,
    (price * quantity) as value,
    region,
    c.category,
    SUM(s.price * s.quantity) OVER (PARTITION BY region) AS sum_value,
    AVG(s.price * s.quantity) OVER (PARTITION BY region) AS avg_value
FROM sales AS s
LEFT JOIN customer AS c ON s.customer_id = c.customer_id
LEFT JOIN shop AS sh ON s.shop_id = sh.shop_id
ORDER BY s.id;
id sale_date price quantity value region category sum_value avg_value
1 2023-01-01 4 1 4 Moscow with discount cards 106 2.8648648648648649
2 2023-01-01 2 2 4 Moscow with discount cards 106 2.8648648648648649
7 2023-01-03 1 1 1 Saint-Petersburg without discount card 75 3.2608695652173913
8 2023-01-03 3 1 3 Kaliningrad with discount cards 36 3.6000000000000000
... ​

View on DB Fiddle

Агрегирующие функции вычисляют значения для окон, указанных в OVER (PARTITION BY region). Теперь рядом с каждой строкой таблицы мы также получим вычисленное значение по группе, в которой есть эта строка. Эти данные позволяют нам провести анализ, например была ли сумма продажи выше или ниже среднего чека по региону.

Выводы

  1. Оконные функции позволяют выполнять агрегатные вычисления не только по всей таблице, но и в пределах определенного окна, что делает их мощным инструментом для аналитики данных
  2. При использовании оконной функции версии функции каждая строка будет иметь доступ к количеству строк в заданном окне.
  3. Для использования оконных функций SUM(), COUNT(), AVG() в SQL необходимо указать OVER() с PARTITION BY для определения окна, в пределах которого будет выполняться вычисление функции.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff