📜  SQL Server LAG()函数概述

📅  最后修改于: 2021-09-10 02:08:40             🧑  作者: Mango

在许多情况下,用户希望从当前行访问前一行或前一行之前的任何行的数据。
为了解决这个问题,可以使用 SQL Server 的 LAG() 窗口函数。

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

句法 :

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

在哪里 :

  1. 标量表达式 –
    根据指定的偏移量返回的值。

  2. 抵消 –
    从当前行返回的行数,从中获取值。如果未指定,则默认为 1。
  3. 默认 –
    default 是 offset 超出分区范围时要返回的值。如果未指定默认值,则返回 NULL。
  4. 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 报告解决方案可以避免在报告层使用繁琐的措施。