Обзор функции SQL Server LAG ()
Во многих случаях пользователь хотел бы получить доступ к данным предыдущей строки или любой строки перед предыдущей строкой из текущей строки.
Для решения этой проблемы можно использовать оконную функцию SQL Server LAG ().
LAG ():
SQL Server предоставляет функцию LAG (), которая очень полезна в случае, если текущие значения строки необходимо сравнить с данными / значением предыдущей записи или любой записи перед предыдущей записью. Предыдущее значение может быть возвращено в той же записи без использования самостоятельного соединения, что упрощает сравнение.
Синтаксис:
LAG (скалярное_выражение [, смещение] [, по умолчанию]) ВЫШЕ ([partition_by] order_by)
Где :
- скалярное_выражение -
Возвращаемое значение на основе указанного смещения. - компенсировать -
Число строк назад от текущей строки, из которых следует получить значение. Если не указано, значение по умолчанию - 1. - По умолчанию -
default - это значение, которое будет возвращено, если смещение выходит за рамки раздела. Если значение по умолчанию не указано, возвращается NULL. - по ([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, могут избежать использования громоздких мер на уровне отчетов.