Оконные функции

Оконные функции (Window Functions) в SQL — это специальные функции, которые выполняют вычисления по строкам внутри "окна", определённого над набором строк, не сворачивая результат в одну строку, в отличие от агрегатных функций.


Основная идея

  • Каждая строка остаётся в результирующем наборе.

  • Окно задаётся с помощью OVER(), которое может включать:

    • PARTITION BY — делит строки на группы (аналог GROUP BY, но без сжатия строк).

    • ORDER BY — задаёт порядок строк внутри окна.


Примеры оконных функций

  1. ROW_NUMBER() — присваивает каждой строке уникальный номер в пределах окна.

SELECT 
    employee_id, 
    department_id,
    ROW_NUMBER() OVER(PARTITION BY department_id ORDER BY salary DESC) AS row_num
FROM employees;
  • Каждому сотруднику в отделе присваивается порядковый номер по зарплате.

  1. RANK() — присваивает ранг с учётом одинаковых значений.

SELECT 
    employee_id,
    salary,
    RANK() OVER(ORDER BY salary DESC) AS salary_rank
FROM employees;
  1. SUM(), AVG() как оконные функции

SELECT 
    department_id,
    employee_id,
    salary,
    SUM(salary) OVER(PARTITION BY department_id) AS total_salary_dept
FROM employees;
  • Считает суммарную зарплату по отделу, но каждая строка остаётся отдельной.


Ключевые отличия от обычных агрегатных функций

  • Агрегатные функции (SUM, AVG) обычно сжимают строки (по GROUP BY).

  • Оконные функции не уменьшают число строк, а дают вычисленное значение для каждой строки в контексте окна.

Last updated

Was this helpful?