Оконные функцииСредний
OVER (оконные функции)
Ключевое слово, превращающее агрегатную функцию в оконную — вычисляет значение без схлопывания строк.
Синтаксис
function() OVER ([PARTITION BY col] [ORDER BY col] [frame])
Объяснение
Оконные функции вычисляют значение для каждой строки с учётом «окна» соседних строк. В отличие от GROUP BY, строки не группируются.
Синтаксис: функция OVER (PARTITION BY ... ORDER BY ... ROWS/RANGE BETWEEN ...)
Выполняются после WHERE, GROUP BY, HAVING — поэтому нельзя фильтровать по их результату в WHERE. Нужен подзапрос или CTE.
Пример
-- Нарастающая сумма продаж по дате SELECT date, sales, SUM(sales) OVER (ORDER BY date) AS running_total FROM daily_sales;
Связанные термины
Анекдоты по теме
— Почему оконная функция ROW_NUMBER() не играет в лотерею? — Потому что она нумерует всех по порядку, а выигрышный номер — тот, у кого ROW_NUMBER = 1 в каждой партиции. Но организаторы про это не знают.
— Зачем нужен PARTITION BY? — Это GROUP BY для оконных функций. Но без схлопывания. — Пример? — SUM(salary) OVER (PARTITION BY department) — сумма зарплат по отделу для каждой строки.
— Зачем NTILE? — Делит строки на N равных групп. — Например? — NTILE(4) OVER (ORDER BY score) — разбивает пользователей на 4 квартиля. — Первый квартиль — лучшие 25%? — Зависит от ORDER BY. С DESC — да.