PARTITION BY
Делит строки на разделы для оконной функции. Аналог GROUP BY, но без схлопывания строк.
function() OVER (PARTITION BY col1, col2 ORDER BY col3)Объяснение
Пример
-- Зарплата сотрудника и доля от суммы по отделу
SELECT
name,
department,
salary,
SUM(salary) OVER (PARTITION BY department) AS dept_total,
ROUND(salary * 100.0 / SUM(salary) OVER (PARTITION BY department), 1) AS pct
FROM employees;Связанные термины
Анекдоты по теме
— Зачем NTILE? — Делит строки на N равных групп. — Например? — NTILE(4) OVER (ORDER BY score) — разбивает пользователей на 4 квартиля. — Первый квартиль — лучшие 25%? — Зависит от ORDER BY. С DESC — да.
— Почему оконная функция ROW_NUMBER() не играет в лотерею? — Потому что она нумерует всех по порядку, а выигрышный номер — тот, у кого ROW_NUMBER = 1 в каждой партиции. Но организаторы про это не знают.
Аналитик хочет топ-3 продукта в каждой категории. Пишет GROUP BY, ORDER BY, LIMIT 3. Получает топ-3 вообще, не по категориям. DBA: тебе нужна оконная функция. ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) Потом WHERE rn <= 3. Аналитик: почему это не просто LIMIT 3 внутри GROUP BY?! DBA: потому что SQL так работает.