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;
Связанные термины
Анекдоты по теме
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);
— Зачем нужен PARTITION BY? — Это GROUP BY для оконных функций. Но без схлопывания. — Пример? — SUM(salary) OVER (PARTITION BY department) — сумма зарплат по отделу для каждой строки.