📜  SQL Server LAG()函数概述

📅  最后修改于: 2021-08-27 17:59:38             🧑  作者: Mango

在许多情况下,用户希望访问当前行中上一行或上一行之前的任何行的数据。
若要解决此问题,可以使用SQL Server的LAG()窗口函数。

LAG():
SQL Server提供了LAG()函数,该函数在需要将当前行值与上一个记录或前一个记录之前的任何记录的数据/值进行比较的情况下非常有用。可以在同一记录上返回先前的值,而无需使用自连接,从而可以轻松进行比较。

句法 :

LAG (scalar_expression [, offset] [, default])  
OVER ( [ partition_by ] order_by )  

在哪里 :

  1. scalar_expression –
    根据指定的偏移量返回的值。
  2. 抵消 –
    从当前行返回以获取值的行数。如果未指定,则默认值为1。
  3. 默认 –
    默认值是偏移量超出分区范围时要返回的值。如果未指定默认值,则返回NULL。
  4. 超过([partition_by] order_by)–
    partition_by将FROM子句产生的结果集划分为应用了该函数的分区。如果省略PARTITION BY子句,则该函数会将整个结果集视为单个组。默认情况下,order_by子句以升序排序。

示例1:

SELECT Organisation, [Year], Revenue,
LAG (Revenue, 1, 0) 
OVER (PARTITION BY Organisation ORDER BY [Year]) AS PrevYearRevenue  
FROM Org 
ORDER BY Organisation, [Year]; 

输出 –

Organisation Year Revenue PrevYearRevenue
ABCD News 2013 440000 0
ABCD News 2014 480000 440000
ABCD News 2015 490000 480000
ABCD News 2016 500000 490000
ABCD News 2017 520000 500000
ABCD News 2018 525000 520000
ABCD News 2019 540000 525000
ABCD News 2020 550000 540000
Z News 2016 720000 0
Z News 2017 750000 720000
Z News 2018 780000 750000
Z News 2019 880000 780000
Z News 2020 910000 880000

在上面的示例中,我们有2个电视新闻频道,使用LAG()函数在同一行中显示了当年和上一年的收入。如您所见,每个电视新闻频道的第一条记录都没有上一年的收入,因此它显示的默认值为0。当您要比较值时,此函数对于为BI报表生成数据非常有用。在连续的时间段内,例如按年比较或按季度比较或每日比较。

示例2:

SELECT Z.*,  (Z.Revenue - z.PrevYearRevenue) as YearonYearGrowth
from (SELECT Organisation, [Year], Revenue,
      LAG (Revenue, 1) 
      OVER (PARTITION BY Organisation ORDER BY [Year] ) AS PrevYearRevenue 
      FROM Org) Z ORDER BY Organisation, [Year]; 

输出 –

Organisation Year Revenue PrevYearRevenue YearOnYearGrowth
ABCD News 2013 440000 NULL NULL
ABCD News 2014 480000 440000 40000
ABCD News 2015 490000 480000 10000
ABCD News 2016 500000 490000 10000
ABCD News 2017 520000 500000 20000
ABCD News 2018 525000 520000 5000
ABCD News 2019 540000 525000 15000
ABCD News 2020 550000 540000 10000
Z News 2016 720000 NULL NULL
Z News 2017 750000 720000 30000
Z News 2018 780000 750000 30000
Z News 2019 880000 780000 100000
Z News 2020 910000 880000 30000

在上面的示例中,我们可以类似地计算电视新闻频道的同比增长。另外,在此示例中要注意的一件事是,我们没有向LAG()提供任何默认参数,因此,在没有先前值的情况下,LAG()函数将返回NULL。

LAG()函数可以在数据库级别实现,而BI报表解决方案(如Power BI和Tableau)可以避免在报表层使用繁琐的措施。