Оконные функции в SQL позволяют выполнять вычисления над группами строк без их агрегации, сохраняя каждую строку в результирующем наборе. Они полезны для выполнения аналитических и статистических операций, таких как ранжирование, вычисление скользящих средних и накопительных сумм.
Синтаксис оконных функций
Оконные функции используют предложение OVER(), которое определяет разбиение (PARTITION BY) и порядок (ORDER BY).
SELECT id, department, salary,
AVG(salary) OVER(PARTITION BY department) AS avg_department_salary
FROM employees;Основные оконные функции
1. Агрегатные функции
Оконные версии агрегатных функций вычисляют значения в пределах окна без группировки строк.
SELECT id, name, salary,
SUM(salary) OVER() AS total_salary,
AVG(salary) OVER(PARTITION BY department) AS avg_salary_per_department
FROM employees;2. Функции ранжирования
ROW_NUMBER()– присваивает уникальный номер каждой строке в рамках окна.RANK()– присваивает одинаковый ранг одинаковым значениям, пропуская следующий номер.DENSE_RANK()– аналогRANK(), но без пропусков номеров.
SELECT id, name, department, salary,
ROW_NUMBER() OVER(PARTITION BY department ORDER BY salary DESC) AS row_num,
RANK() OVER(PARTITION BY department ORDER BY salary DESC) AS rank_num,
DENSE_RANK() OVER(PARTITION BY department ORDER BY salary DESC) AS dense_rank_num
FROM employees;3. Функции смещения
LAG(column, offset, default)– возвращает значение из предыдущей строки.LEAD(column, offset, default)– возвращает значение из следующей строки.
SELECT id, name, salary,
LAG(salary, 1, 0) OVER(ORDER BY id) AS previous_salary,
LEAD(salary, 1, 0) OVER(ORDER BY id) AS next_salary
FROM employees;4. Кумулятивные функции
CUME_DIST()– относительный ранг строки в наборе данных.PERCENT_RANK()– нормализованный ранг.
SELECT id, name, salary,
CUME_DIST() OVER(ORDER BY salary) AS cume_dist,
PERCENT_RANK() OVER(ORDER BY salary) AS percent_rank
FROM employees;