Оконные функцииСредний
LAG / LEAD
LAG возвращает значение из предыдущей строки окна, LEAD — из следующей.
Синтаксис
LAG(col [, offset [, default]]) OVER (ORDER BY col) LEAD(col [, offset [, default]]) OVER (ORDER BY col)
Объяснение
LAG и LEAD позволяют сравнивать текущую строку с соседними без self-join.
Параметры: LAG(col, offset, default) — col из строки на offset позиций назад; default — если строки нет.
Типичное применение: вычислить изменение/рост между периодами.
Пример
-- Изменение продаж по сравнению с предыдущим месяцем SELECT month, sales, LAG(sales) OVER (ORDER BY month) AS prev_sales, sales - LAG(sales) OVER (ORDER BY month) AS diff FROM monthly_sales;
Связанные термины
OVER (оконные функции)Ключевое слово, превращающее агрегатную функцию в оконную — вычисляет значение без схлопывания строк.PARTITION BYДелит строки на разделы для оконной функции. Аналог GROUP BY, но без схлопывания строк.ROW_NUMBER / RANK / DENSE_RANKОконные функции нумерации строк. Различаются поведением при одинаковых значениях.
Анекдоты по теме
Приходит запрос на свидание к оконной функции LAG(). — Пойдём со мной? — Нет, я люблю оглядываться на прошлое. Я буду смотреть на предыдущее значение, пока ты будешь говорить о настоящем. И вообще, без ORDER BY я не работаю.
— Доктор, у меня шизофрения. — Это лечится. Расскажите подробно. — WITH моей_личности AS (SELECT боль, радость, тревогу, ROW_NUMBER() OVER (PARTITION BY день_недели ORDER BY кофеин DESC) FROM психика)... Ой, кажется, я только что создал три новых партиции самосознания.
— Зачем нужен PARTITION BY? — Это GROUP BY для оконных функций. Но без схлопывания. — Пример? — SUM(salary) OVER (PARTITION BY department) — сумма зарплат по отделу для каждой строки.