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