Оконные функции
1711 мин
GROUP BY «сворачивает» строки в одну. Оконные функции оставляют каждую строку на месте и добавляют рядом расчёт по группе: место в рейтинге, нарастающий итог, значение из предыдущей строки.
Шаблон
функция() OVER (PARTITION BY группа ORDER BY порядок)PARTITION BY— внутри каких групп считать (если не указать — весь результат одна группа);ORDER BY— порядок внутри группы.
Места: ROW_NUMBER, RANK, DENSE_RANK
ROW_NUMBER— 1, 2, 3… даже равным значениям разные номера;RANK— равным одно место, следующее с пропуском (1, 1, 3);DENSE_RANK— равным одно место, без пропуска (1, 1, 2).
Внутри каждой группы
Преподаватель с самой высокой зарплатой на каждом факультете:
Оконную функцию нельзя использовать в WHERE, поэтому сначала считаем её в CTE, а потом фильтруем.
Агрегат + OVER: доля и нарастающий итог
SUM(...) OVER () — итог по всему результату рядом с каждой строкой.
Нарастающая выручка по месяцам:
LAG и LEAD — соседняя строка
LAG(x) — значение из предыдущей строки, LEAD(x) — из следующей. Изменение по сравнению с прошлым месяцем:
Выведите first_name, last_name, salary каждого сотрудника и его место по зарплате во всей компании (DENSE_RANK, самая высокая — 1). По возрастанию места.
Выведите id, first_name каждого студента и его место в своей группе: кто раньше поступил (enrolled_at) — тот первый, при равной дате — меньший id (ROW_NUMBER, PARTITION BY group_id).
Запомните
- Оконная функция не сворачивает строки — она добавляет расчёт к каждой строке.
PARTITION BY— группа,ORDER BY— порядок.- Чтобы фильтровать по результату, сначала нужен CTE или подзапрос.