Оконные функцииСредний
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;
Связанные термины
Анекдоты по теме
RANK() и DENSE_RANK() поспорили о справедливости. RANK(): — Если двое на первом месте, следующий — третий. DENSE_RANK(): — Если двое на первом месте, следующий — второй. ROW_NUMBER(): — Мне всё равно. Каждый получает уникальный номер.
— Какая оконная функция самая печальная? — LAG(). Потому что она всегда оглядывается на прошлое и никогда не смотрит вперёд.
Задача: найти разницу продаж между текущим и предыдущим месяцем. Решение: SELECT month, sales, sales - LAG(sales) OVER (ORDER BY month) AS diff FROM monthly_sales; Программист: одна строка вместо самостоятельного JOIN! DBA: вот за это любят оконные функции.