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;Связанные термины
Анекдоты по теме
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)
LEAD() смотрит вперёд. LAG() смотрит назад. Они никогда не встречаются в одной строке результата. Но в одном запросе — пожалуйста: SELECT LAG(price) OVER w, LEAD(price) OVER w FROM prices WINDOW w AS (ORDER BY date);
— Что такое оконная функция? — Это агрегат, который не схлопывает строки. — Как? — Представь, что GROUP BY считает итог для группы. Оконная функция считает итог, но оставляет каждую строку.