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

Опубликовано: 15 Августа, 2021

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

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

Синтаксис:

 LAG (скалярное_выражение [, смещение] [, по умолчанию])  
ВЫШЕ ([partition_by] order_by)

Где :

  1. скалярное_выражение -
    Возвращаемое значение на основе указанного смещения.

  2. компенсировать -
    Число строк назад от текущей строки, из которых следует получить значение. Если не указано, значение по умолчанию - 1.
  3. По умолчанию -
    default - это значение, которое будет возвращено, если смещение выходит за рамки раздела. Если значение по умолчанию не указано, возвращается NULL.
  4. по ([partition_by] order_by) -
    partition_by делит набор результатов, созданный предложением FROM, на разделы, к которым применяется функция. Если вы опустите предложение PARTITION BY, функция обрабатывает весь набор результатов как одну группу. По умолчанию предложение order_by сортируется в порядке возрастания.

Пример-1:

 ВЫБЕРИТЕ организацию, [Год], Выручку,
LAG (доход, 1, 0) 
БОЛЕЕ (РАЗДЕЛЕНИЕ ПО ОРГАНИЗАЦИЯМ В ЗАКАЗЕ ПО [ГОДУ]) КАК ПРЕДЫДУЩИЙ Доход  
ОТ ОРГ 
ЗАКАЗАТЬ ПО организации, [год];

Выход -

Организация Год Доход Предыдущий год
ABCD Новости 2013 440000 0
ABCD Новости 2014 г. 480000 440000
ABCD Новости 2015 г. 490000 480000
ABCD Новости 2016 г. 500000 490000
ABCD Новости 2017 г. 520000 500000
ABCD Новости 2018 г. 525000 520000
ABCD Новости 2019 г. 540000 525000
ABCD Новости 2020 г. 550000 540000
Z Новости 2016 г. 720000 0
Z Новости 2017 г. 750000 720000
Z Новости 2018 г. 780000 750000
Z Новости 2019 г. 880000 780000
Z Новости 2020 г. 910000 880000

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

Пример-2:

 ВЫБЕРИТЕ Z. *, (Z.Revenue - z.PrevYearRevenue) как YearonYearGrowth
из (ВЫБЕРИТЕ организацию, [Год], Доход,
      LAG (доход, 1) 
      БОЛЕЕ (РАЗДЕЛЕНИЕ ПО ОРГАНИЗАЦИЯМ В ЗАКАЗЕ ПО [ГОДУ]) КАК ПРЕДЫДУЩИЙ Доход 
      FROM Org) Z ORDER BY Организация, [Год];

Выход -

Организация Год Доход Предыдущий год ГодOnYearGrowth
ABCD Новости 2013 440000 НОЛЬ НОЛЬ
ABCD Новости 2014 г. 480000 440000 40000
ABCD Новости 2015 г. 490000 480000 10000
ABCD Новости 2016 г. 500000 490000 10000
ABCD Новости 2017 г. 520000 500000 20000
ABCD Новости 2018 г. 525000 520000 5000
ABCD Новости 2019 г. 540000 525000 15000
ABCD Новости 2020 г. 550000 540000 10000
Z Новости 2016 г. 720000 НОЛЬ НОЛЬ
Z Новости 2017 г. 750000 720000 30000
Z Новости 2018 г. 780000 750000 30000
Z Новости 2019 г. 880000 780000 100000
Z Новости 2020 г. 910000 880000 30000

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

Функцию LAG () можно реализовать на уровне базы данных, а решения для создания отчетов BI, такие как Power BI и Tableau, могут избежать использования громоздких мер на уровне отчетов.