Этот вопрос проверяет понимание расширенных возможностей SQL для анализа данных без группировки строк.
Оконные функции выполняют вычисления над набором строк, связанных с текущей строкой (окном). Они не группируют данные в одну строку, а сохраняют все строки. Примеры: ROW_NUMBER(), RANK(), SUM() OVER().
Что такое окно:
Это набор строк, связанных с текущей записью (например, все строки раздела или диапазона).
Определяется через OVER() с указанием:
PARTITION BY (аналог GROUP BY для окна),
ORDER BY (порядок внутри окна),
ROWS/RANGE (физические/логические границы).
Примеры функций:
Ранжирование:
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;Присваивает уникальный номер строкам по убыванию зарплаты.
Агрегация без свёртки:
SELECT department, employee, salary,
AVG(salary) OVER (PARTITION BY department) AS avg_department_salary
FROM employees;Для каждого сотрудника показывает среднюю зарплату по его отделу.
Доступ к смежным строкам:
SELECT date, revenue,
LAG(revenue) OVER (ORDER BY date) AS prev_day_revenue
FROM sales;Сравнивает выручку с предыдущим днём.
Преимущества:
Упрощают сложные отчёты (например, скользящие средние).
Избегают многоуровневых подзапросов.