Агрегатная функция 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 — результаты для разных групп перемешались. Итог — искажённая отчётность. После исправления разбивки по группам данные стали корректны.