Что такое оконные функции в SQL?

«Что такое оконные функции в SQL?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые компоненты:

  • OVER(): Обязательная конструкция, определяющая "окно" — набор строк для вычисления.
  • PARTITION BY: Разбивает данные на группы (партиции), внутри которых работает функция. Аналогично GROUP BY, но без агрегации.
  • ORDER BY: Задает порядок строк внутри окна или партиции, что критично для функций ранжирования и накопительных итогов.
  • ROWS/RANGE BETWEEN: Определяет фрейм — точный поднабор строк внутри окна для расчета (например, ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING).

Основные типы оконных функций:

  1. Ранжирующие: ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE().
  2. Агрегатные: SUM(), AVG(), COUNT(), MIN(), MAX() (используемые с OVER).
  3. Функции смещения: LAG() (значение из предыдущей строки), LEAD() (значение из следующей строки).
  4. Функции доступа к значениям: 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;

Это мощный инструмент для сложных аналитических запросов без необходимости использования коррелированных подзапросов.