Функция LAG SQL Server

В этом уроке вы узнаете, как использовать функцию LAG() для доступа к строке с определенным физическим смещением, которая находится перед текущей строкой.

Обзор функции SQL Server LAG()

LAG() SQL Server — это оконная функция, которая обеспечивает доступ к строке с указанным физическим смещением, которая находится перед текущей строкой.

Другими словами, используя функцию LAG(), из текущей строки можно получить доступ к данным предыдущей строки или строки перед предыдущей строкой и т. д.

Функция LAG() может быть очень полезна для сравнения значения текущей строки со значением предыдущей строки.

Ниже показан синтаксис функции LAG():

LAG(return_value ,offset [,default]) 
OVER(
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

В этом синтаксисе:

возвращаемое_значение

Возвращаемое значение предыдущей строки на основе указанного смещения. Возвращаемое значение должно оцениваться как одно значение и не может быть другой оконной функцией.

компенсировать

Количество строк от текущей строки, из которых следует получить доступ к данным. offset может быть выражением, подзапросом или столбцом, результатом которого является положительное целое число.

Значение смещения по умолчанию равно 1, если оно не указано явно.

по умолчанию

default — это возвращаемое значение, если offset выходит за рамки раздела. По умолчанию NULL, если не указано иное.

РАЗДЕЛЕНИЕ ПО пункту

Предложение PARTITION BY распределяет строки результирующего набора по разделам, к которым применяется функция LAG().

Если опустить предложение PARTITION BY, функция будет обрабатывать весь результирующий набор как один раздел.

Предложение ORDER BY

Предложение ORDER BY определяет логический порядок строк в каждом разделе, к которому применяется функция LAG().

Примеры функций SQL Server LAG()

Для демонстрации мы повторно используем представление sales.vw_netsales_brands, созданное в руководстве по функции LEAD().

Следующий запрос показывает данные из представления sales.vw_netsales_brands:

SELECT 
 *
FROM 
 sales.vw_netsales_brands
ORDER BY 
 year, 
 month, 
 brand_name, 
 net_sales;

Вот что получилось:

Пример функции SQL Server LAG Просмотр

A) Пример использования функции SQL Server LAG() для набора результатов

В этом примере функция LAG() используется для возврата чистых продаж за текущий месяц и предыдущий месяц 2018 года:

WITH cte_netsales_2018 AS(
 SELECT 
 month, 
 SUM(net_sales) net_sales
 FROM 
 sales.vw_netsales_brands
 WHERE 
 year = 2018
 GROUP BY 
 month
)
SELECT 
 month,
 net_sales,
 LAG(net_sales,1) OVER(
 ORDER BY month
 ) previous_month_sales
FROM 
 cte_netsales_2018;

Вот что получилось:

Функция SQL Server LAG над результирующим набором

В этом примере:

  • Во-первых, CTE возвращает чистые продажи, сгруппированные по месяцам.
  • Затем внешний запрос использует функцию LAG() для возврата продаж за предыдущий месяц.

B) Пример использования функции SQL Server LAG() для разделов

В следующем операторе используется функция LAG() для сравнения продаж текущего месяца с предыдущим месяцем каждого бренда в 2018 году:

SELECT 
 month,
 brand_name,
 net_sales,
 LAG(net_sales,1) OVER(
 PARTITION BY brand_name
 ORDER BY month
 ) next_month_sales
FROM 
 sales.vw_netsales_brands
WHERE
 year = 2018;

На этой картинке показан результат:

Функция SQL Server LAG по разделу

В этом примере:

  • Предложение PARTITION BY разделило строки на разделы по названию бренда.
  • Для каждого раздела(или наименования бренда) предложение ORDER BY сортирует строки по месяцу.
  • Для каждой строки в каждом разделе функция LAG() возвращает чистый объем продаж предыдущей строки.

Чтобы сравнить продажи текущего месяца с чистыми продажами по брендам за предыдущий месяц 2018 года, используйте следующий запрос:

WITH cte_sales AS(
 SELECT 
 month,
 brand_name,
 net_sales,
 LAG(net_sales,1) OVER(
 PARTITION BY brand_name
 ORDER BY month
 ) previous_sales
 FROM 
 sales.vw_netsales_brands
 WHERE
 year = 2018
)
SELECT 
 month, 
 brand_name,
 net_sales, 
 previous_sales,
 FORMAT(
(net_sales - previous_sales)  / previous_sales,
 'P'
 ) vs_previous_month
FROM
 cte_sales;

Вывод следующий:

Сравнение данных функции LAG SQL Server

В этом руководстве вы узнали, как использовать функцию SQL Server LAG() для доступа к строке с определенным физическим смещением, которая следует за текущей строкой.

Мирослав С.

Автор статей, ИБ-специалист