Ответ
Оконные функции (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()как оконные функции.