LAG / LEAD
LAG возвращает значение из предыдущей строки окна, LEAD — из следующей.
LAG(col [, offset [, default]]) OVER (ORDER BY col)
LEAD(col [, offset [, default]]) OVER (ORDER BY col)Объяснение
Пример
-- Изменение продаж по сравнению с предыдущим месяцем
SELECT
month,
sales,
LAG(sales) OVER (ORDER BY month) AS prev_sales,
sales - LAG(sales) OVER (ORDER BY month) AS diff
FROM monthly_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? — От начала окна до текущей строки. Нарастающий итог.