Какой у вас опыт использования оконных функций в SQL?

«Какой у вас опыт использования оконных функций в SQL?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевое отличие от GROUP BY: Оконные функции не группируют результат, а добавляют вычисляемые столбцы к каждой исходной строке.

Пример запроса:

SELECT 
    employee_id,
    department_id,
    salary,
    -- Средняя зарплата по отделу для каждой строки
    AVG(salary) OVER (PARTITION BY department_id) AS avg_department_salary,
    -- Ранг зарплаты внутри отдела
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank
FROM employees;

Основные компоненты и их применение:

  • OVER(): Определяет "окно" — набор строк для вычисления.
  • PARTITION BY: Разделяет данные на группы (аналог GROUP BY, но без агрегации).
  • ORDER BY внутри OVER(): Задает порядок строк в окне для функций ранжирования (RANK, ROW_NUMBER) и накопительных итогов.

Часто используемые функции:

  • Агрегатные: SUM(), AVG(), COUNT().
  • Ранжирующие: RANK(), DENSE_RANK(), ROW_NUMBER().
  • Смещения: LAG(), LEAD() для доступа к данным из предыдущей/следующей строки.

Использовал для анализа данных, построения отчетов и сравнения строк внутри логических групп.