ПрограммированиеАналитик-отчётчик (SQL Analyst)

Чем отличается агрегатная функция SUM() от оконной функции SUM()? В каких задачах предпочтительнее использовать оконные функции? Приведите пример.

Проходите собеседования с ИИ помощником Hintsage

Ответ

Агрегатная функция SUM() суммирует значения по всей группе строк в наборе результатов, возвращая одно значение для каждой группы (или всего запроса). Оконная функция SUM() позволяет расчитать сумму по "окну" значений, определённому в пределах SELECT'а (через OVER()), при этом каждая строка сохраняется в результате и получает доступ к агрегированному результату по своему "окну". Это особенно удобно для получения промежуточных итогов по группам.

Пример агрегатной функции:

SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;

Пример оконной функции:

SELECT department_id, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) FROM employees;

Вопрос с подвохом

“Можно ли получить кумулятивную («бегущую») сумму по колонке только при помощи агрегатной функции GROUP BY?”

Ответ: Нет! GROUP BY даёт только финальные агрегаты, бегущая сумма требует либо оконной функции, либо сложных подзапросов, которые сложнее и медленнее.

Пример:

SELECT salary, SUM(salary) OVER (ORDER BY hire_date) AS running_total FROM employees;

История

В отчёте по транзакциям бегущая сумма реализована множеством коррелированных подзапросов. При росте таблицы производительность упала в десятки раз. Перевели на оконную функцию — всё вернулось к секундам.


История

Попытка сделать сложную аналитику с итогами по группам через GROUP BY вылилась в несколько этапов выгрузки и обработки во внешнем ПО. Оконные функции позволили сделать нужный отчёт в одном SQL-запросе.


История

Аналитик написал запрос с оконными функциями, используя неправильную PARTITION BY — результаты для разных групп перемешались. Итог — искажённая отчётность. После исправления разбивки по группам данные стали корректны.