在许多情况下,用户希望访问当前行中上一行或上一行之前的任何行的数据。
若要解决此问题,可以使用SQL Server的LAG()窗口函数。
LAG():
SQL Server提供了LAG()函数,该函数在需要将当前行值与上一个记录或前一个记录之前的任何记录的数据/值进行比较的情况下非常有用。可以在同一记录上返回先前的值,而无需使用自连接,从而可以轻松进行比较。
句法 :
LAG (scalar_expression [, offset] [, default])
OVER ( [ partition_by ] order_by )
在哪里 :
- scalar_expression –
根据指定的偏移量返回的值。 - 抵消 –
从当前行返回以获取值的行数。如果未指定,则默认值为1。 - 默认 –
默认值是偏移量超出分区范围时要返回的值。如果未指定默认值,则返回NULL。 - 超过([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)可以避免在报表层使用繁琐的措施。