SQL Server LAST_VALUE() 函数使用指南

LAST_VALUE() 函数是 SQL Server 中的一种窗口函数,用于在分组中获取最后一个值。该函数可以在 SELECT 语句中使用,以返回分组中每个行的最后一个值。 LAST_VALUE() 函数需要与 OVER 子句一起使用。

语法

LAST_VALUE() 函数的语法如下:

LAST_VALUE(expression) OVER (
  [PARTITION BY partition_expression, ... ]
  ORDER BY order_expression [ASC | DESC]
  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)

其中:

  • expression:指定要返回最后一个值的列或表达式。
  • PARTITION BY:可选,指定要分组的列或表达式。
  • ORDER BY:指定对每个分组内的行排序的列或表达式。
  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:指定窗口大小,用于计算每个行的最后一个值。

使用场景

LAST_VALUE() 函数通常用于在分组中获取最后一个值。例如,假设有一个包含订单历史记录的表,我们可以使用 LAST_VALUE() 函数获取每个订单的最终状态。此外, LAST_VALUE() 函数也可以用于处理时间序列数据,以获取每个时间段的最后一个值。

示例

示例 1

假设有一个名为 sales 的表,其中包含以下数据:

order_id product_id sales
1 A 100
2 A 200
3 B 300
4 B 400
5 B 500

我们可以使用 LAST_VALUE() 函数获取每个产品的最后一个销售额。下面是查询语句和结果:

SELECT DISTINCT
  product_id,
  LAST_VALUE(sales) OVER (PARTITION BY product_id ORDER BY order_id) AS last_sales
FROM sales;

查询结果:

product_id last_sales
A 200
B 500

示例 2

假设有一个名为 stocks 的表,其中包含以下数据:

date stock_code price
2022-01-01 A 10
2022-01-02 A 20
2022-01-03 A 30
2022-01-01 B 5
2022-01-02 B 15
2022-01-03 B 25

我们可以使用 LAST_VALUE() 函数获取每个股票代码的最后一个价格。下面是查询语句和结果:

SELECT DISTINCT
  stock_code,
  LAST_VALUE(price) OVER (PARTITION BY stock_code ORDER BY date) AS last_price
FROM stocks;

查询结果:

stock_code last_price
A 30
B 25

假设我们想要获取每个股票代码的最后一个价格和前一天的价格。为此,我们可以在 LAST_VALUE() 函数中添加 ROWS BETWEEN 子句,并将其设置为 UNBOUNDED PRECEDING 和 1 PRECEDING。这样,我们可以获取每个行的最后一个值和前一个值。下面是查询语句和结果:

SELECT DISTINCT
  stock_code,
  LAST_VALUE(price) OVER (PARTITION BY stock_code ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prev_price,
  LAST_VALUE(price) OVER (PARTITION BY stock_code ORDER BY date) AS last_price
FROM stocks;

查询结果:

stock_code prev_price last_price
A NULL 20
A 20 30
B NULL 15
B 15 25

在上面的查询结果中,我们可以看到每个股票代码的最后一个价格和前一天的价格。由于第一天没有前一天的价格,因此在 prev_price 列中显示了 NULL 值。

结论

LAST_VALUE() 函数是 SQL Server 中的一个有用工具,用于在分组中获取最后一个值。它可以帮助我们处理包含时间序列数据的表格,并查找每个时间段的最后一个值。在使用 LAST_VALUE() 函数时,需要注意指定分组、排序和窗口大小等参数,以确保获取正确的结果。