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;Связанные термины
Анекдоты по теме
— Почему оконная функция ROW_NUMBER() не играет в лотерею? — Потому что она нумерует всех по порядку, а выигрышный номер — тот, у кого ROW_NUMBER = 1 в каждой партиции. Но организаторы про это не знают.
FIRST_VALUE и LAST_VALUE: — FIRST_VALUE(price) OVER (PARTITION BY product ORDER BY date) — первая цена продукта. — LAST_VALUE(price) OVER (...) — осторожно! По умолчанию frame заканчивается на текущей строке. — Чтобы получить реально последнее значение: ...OVER (PARTITION BY product ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
— Какая оконная функция самая печальная? — LAG(). Потому что она всегда оглядывается на прошлое и никогда не смотрит вперёд.