Ответ
Оконные функции (Window Functions) в SQL выполняют вычисления над набором строк (так называемым «окном»), которые связаны с текущей строкой. Главное их отличие от агрегатных функций с GROUP BY
в том, что они не сворачивают (не коллапсируют) строки, а возвращают результат для каждой строки.
Ключевые отличия от GROUP BY
:
- Сохранение строк: Оконная функция сохраняет исходное количество строк в результате,
GROUP BY
— сжимает их до одной строки на группу. - Доступ к данным: Оконная функция имеет доступ к другим строкам в своем «окне», но результат выводит для текущей строки.
Синтаксис оконной функции определяется клаузой OVER()
:
FUNCTION_NAME() OVER ( [PARTITION BY ...] [ORDER BY ...] [FRAME_CLAUSE] )
PARTITION BY
— делит строки на группы (партиции), для которых функция будет вычисляться независимо. АналогичноGROUP BY
.ORDER BY
— упорядочивает строки внутри партиции. Важно для функций ранжирования и функций, зависящих от порядка.FRAME_CLAUSE
(ROWS
илиRANGE
) — определяет точные границы «окна» относительно текущей строки (например,ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
).
Пример:
Вывести зарплату каждого сотрудника, среднюю зарплату по его отделу и его ранг в этом отделе.
SELECT
employee_name,
department,
salary,
-- Средняя зарплата по отделу (окно - весь отдел)
AVG(salary) OVER(PARTITION BY department) as avg_dept_salary,
-- Ранг сотрудника по зарплате внутри отдела
RANK() OVER(PARTITION BY department ORDER BY salary DESC) as rank_in_dept
FROM employees;
Популярные категории функций:
- Ранжирующие:
ROW_NUMBER()
,RANK()
,DENSE_RANK()
,NTILE()
. - Смещения:
LEAD()
(доступ к следующей строке),LAG()
(доступ к предыдущей строке). - Агрегатные:
SUM()
,AVG()
,COUNT()
,MAX()
,MIN()
как оконные функции.