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;
Связанные термины
Анекдоты по теме
Приходит запрос на свидание к оконной функции LAG(). — Пойдём со мной? — Нет, я люблю оглядываться на прошлое. Я буду смотреть на предыдущее значение, пока ты будешь говорить о настоящем. И вообще, без ORDER BY я не работаю.
— Можно ли использовать WHERE на результат оконной функции? — Нет. — Почему?! — Оконные функции вычисляются ПОСЛЕ WHERE. В WHERE их ещё нет. — Как тогда фильтровать? — Обернуть в подзапрос или CTE, потом фильтровать внешним WHERE.
RANK() и DENSE_RANK() поспорили о справедливости. RANK(): — Если двое на первом месте, следующий — третий. DENSE_RANK(): — Если двое на первом месте, следующий — второй. ROW_NUMBER(): — Мне всё равно. Каждый получает уникальный номер.