📜  SQL Server LAG()函数概述(1)

📅  最后修改于: 2023-12-03 15:05:17.385000             🧑  作者: Mango

SQL Server LAG()函数概述

LAG()是一个SQL Server中的窗口函数,它用于获取一个指定行之前的数据。Windows函数在处理大数据集时非常有用。我们可以在一个表中获取一个指定行之前的值,或根据特定列或表达式定义一个操作符。

语法

以下是使用LAG()函数的语法:

LAG (scalar_expression [,offset] [,default]) 
OVER ( [ partition_by_clause ] order_by_clause )
  • scalar_expression:必要的参数。要检索前一行值的当前行值或某个表达式。
  • offset:可选项。指定将查询结果向前跳过的行数。默认为1。
  • default:可选项。指定如果请求的偏移值超出范围的替代值。默认为NULL。
  • partition_by_clause:可选项。指定要分组、排序或排除的数据行集。所有拥有相同分组条件的行集将作为一组处理。如果没有提供此值,则对整个结果集执行函数。
  • order_by_clause:必要的参数。确定如何排序行的顺序。
示例

假设我们有以下Sales表:

| SalesDate  | Product  | Quantity |
|------------|----------|----------|
| 2021-05-01 | Apple    | 10       |
| 2021-05-02 | Apple    | 5        |
| 2021-05-03 | Apple    | 7        |
| 2021-05-01 | Orange   | 3        |
| 2021-05-02 | Orange   | 4        |
| 2021-05-03 | Orange   | 2        |

如果我们想要展示 sales 在每天的销量以及前一天的销量,我们可以通过以下查询实现:

SELECT SalesDate,
       Product,
       Quantity,
       LAG(Quantity, 1) OVER (PARTITION BY Product ORDER BY SalesDate) AS LastDayQuantity
FROM Sales;

此查询将输出如下结果:

| SalesDate  | Product  | Quantity | LastDayQuantity |
|------------|----------|----------|-----------------|
| 2021-05-01 | Apple    | 10       | NULL           |
| 2021-05-02 | Apple    | 5        | 10             |
| 2021-05-03 | Apple    | 7        | 5              |
| 2021-05-01 | Orange   | 3        | NULL           |
| 2021-05-02 | Orange   | 4        | 3              |
| 2021-05-03 | Orange   | 2        | 4              |

在此查询中,我们在Quantity列的旁边添加了另一列LastDayQuantity。该列显示每个产品的上一天的销量。我们在OVER子句中使用分区和排列子句来定义窗口大小,并按产品和销售日期对结果进行分组和排序。然后,我们使用LAG函数通过指定(Quantity,1)获取前一天的销量值,以便从当前行检索LastDayQuantity值。

总结

使用LAG函数,我们可以轻松地检索行上之前的值,在处理数据集时进行了简化。这个函数帮助我们计算two time-points之间的差异,分析one row 和previous row的数据变化,并绘制趋势行程。 这使其在分析每日或周期性数据时非常有用。