Оконные функцииСредний
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Оконные функции нумерации строк. Различаются поведением при одинаковых значениях.
Анекдоты по теме
Программист видит оконную функцию первый раз: ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) — Это что, GROUP BY внутри ORDER BY внутри OVER? — Добро пожаловать в мир аналитических запросов.
LEAD() смотрит вперёд. LAG() смотрит назад. Они никогда не встречаются в одной строке результата. Но в одном запросе — пожалуйста: SELECT LAG(price) OVER w, LEAD(price) OVER w FROM prices WINDOW w AS (ORDER BY date);
RANK() и DENSE_RANK() поспорили о справедливости. RANK(): — Если двое на первом месте, следующий — третий. DENSE_RANK(): — Если двое на первом месте, следующий — второй. ROW_NUMBER(): — Мне всё равно. Каждый получает уникальный номер.