Ответ
Оконные функции (Window Functions) в SQL позволяют выполнять вычисления над набором строк, связанных с текущей строкой, без сворачивания результатов в одну строку, в отличие от агрегатных функций с GROUP BY. Они сохраняют все исходные строки результата.
Ключевые компоненты:
OVER(): Обязательная конструкция, определяющая "окно" — набор строк для вычисления.PARTITION BY: Разбивает данные на группы (партиции), внутри которых работает функция. АналогичноGROUP BY, но без агрегации.ORDER BY: Задает порядок строк внутри окна или партиции, что критично для функций ранжирования и накопительных итогов.ROWS/RANGE BETWEEN: Определяет фрейм — точный поднабор строк внутри окна для расчета (например,ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING).
Основные типы оконных функций:
- Ранжирующие:
ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE(). - Агрегатные:
SUM(),AVG(),COUNT(),MIN(),MAX()(используемые сOVER). - Функции смещения:
LAG()(значение из предыдущей строки),LEAD()(значение из следующей строки). - Функции доступа к значениям:
FIRST_VALUE(),LAST_VALUE(),NTH_VALUE().
Практический пример — расчет накопительного итога и ранга:
SELECT
employee_id,
department_id,
salary,
-- Накопительная сумма зарплат по отделам
SUM(salary) OVER (
PARTITION BY department_id
ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total,
-- Ранг зарплаты внутри отдела
RANK() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS salary_rank_in_dept
FROM employees;
Это мощный инструмент для сложных аналитических запросов без необходимости использования коррелированных подзапросов.