OVER (оконные функции)
Ключевое слово, превращающее агрегатную функцию в оконную — вычисляет значение без схлопывания строк.
function() OVER ([PARTITION BY col] [ORDER BY col] [frame])Объяснение
Пример
-- Нарастающая сумма продаж по дате
SELECT
date,
sales,
SUM(sales) OVER (ORDER BY date) AS running_total
FROM daily_sales;Связанные термины
Анекдоты по теме
Аналитик хочет топ-3 продукта в каждой категории. Пишет GROUP BY, ORDER BY, LIMIT 3. Получает топ-3 вообще, не по категориям. DBA: тебе нужна оконная функция. ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) Потом WHERE rn <= 3. Аналитик: почему это не просто LIMIT 3 внутри GROUP BY?! DBA: потому что SQL так работает.
Задача: найти разницу продаж между текущим и предыдущим месяцем. Решение: SELECT month, sales, sales - LAG(sales) OVER (ORDER BY month) AS diff FROM monthly_sales; Программист: одна строка вместо самостоятельного JOIN! DBA: вот за это любят оконные функции.
— Что такое FRAME в оконных функциях? — Часть окна, над которой считается функция для текущей строки. — Например? — ROWS BETWEEN 2 PRECEDING AND CURRENT ROW — скользящее среднее за 3 строки. — А UNBOUNDED PRECEDING? — От начала окна до текущей строки. Нарастающий итог.