SQL Server Lead()函数

在本教程中,将学习如何使用SQL Server LEAD()函数访问当前行之后的特定物理偏移量的行。

SQL Server LEAD()函数简介

SQL Server LEAD()是一个Window函数,它提供对当前行之后的指定物理偏移量的行的访问。

例如,通过使用LEAD()函数,可以从当前行访问下一行的数据或下一行之后的行,依此类推。

LEAD()函数对于将当前行的值与后续行的值进行比较非常有用。

以下是LEAD()函数的语法:

LEAD(return_value ,offset [,default]) 
OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

在上面语法中,

  • return_value - 基于指定偏移量的后续行的返回值。返回值必须求值为单个值,不能是另一个Window函数。
  • offset是从当前行转发的行数,用于访问数据。offset可以是表达式,子查询或列,其值为正整数。如果未明确指定,则offset的默认值为1
  • 如果offset超出分区范围,则该函数返回default。 如果未指定,则默认为NULL
  • PARTITION BY子句将结果集的行分配到应用了LEAD()函数的分区。
  • 如果未指定PARTITION BY子句,则该函数将整个结果集视为单个分区。
  • ORDER BY子句指定应用LEAD()函数的每个分区中行的逻辑顺序。

SQL Server LEAD()函数示例

为了方便演示,下面创建一个名为sales.vw_netsales_brands的新视图:

CREATE VIEW sales.vw_netsales_brands
AS
 SELECT 
 c.brand_name, 
 MONTH(o.order_date) month, 
 YEAR(o.order_date) year, 
 CONVERT(DEC(10, 0), SUM((i.list_price * i.quantity) * (1 - i.discount))) AS net_sales
 FROM sales.orders AS o
 INNER JOIN sales.order_items AS i ON i.order_id = o.order_id
 INNER JOIN production.products AS p ON p.product_id = i.product_id
 INNER JOIN production.brands AS c ON c.brand_id = p.brand_id
 GROUP BY c.brand_name, 
 MONTH(o.order_date), 
 YEAR(o.order_date);

以下查询返回sales.vw_netsales_brands视图中的数据:

SELECT 
 *
FROM 
 sales.vw_netsales_brands
ORDER BY 
 year, 
 month, 
 brand_name, 
 net_sales;

执行上面查询语句,得到以下结果:
查询结果

1. 在结果集中使用SQL Server LEAD()函数示例
以下语句使用LEAD()函数返回2017年当月和下个月的净销售额:

WITH cte_netsales_2017 AS(
 SELECT 
 month, 
 SUM(net_sales) net_sales
 FROM 
 sales.vw_netsales_brands
 WHERE 
 year = 2017
 GROUP BY 
 month
)
SELECT 
 month,
 net_sales,
 LEAD(net_sales,1) OVER (
 ORDER BY month
 ) next_month_sales
FROM 
 cte_netsales_2017;

执行上面查询语句,得到以下结果:

查询结果

在这个例子中:

  • 首先,CTE返回按月汇总的净销售额。
  • 然后,外部查询使用LEAD()函数返回每个月的下个月销售额。

通过这样做,可以比较当月与下个月的销售额。

在分区上使用SQL Server LEAD()函数示例

以下语句使用LEAD()函数比较当前月份的销售额与2018年每个品牌的下个月:

SELECT 
 month,
 brand_name,
 net_sales,
 LEAD(net_sales,1) OVER (
 PARTITION BY brand_name
 ORDER BY month
 ) next_month_sales
FROM 
 sales.vw_netsales_brands
WHERE
 year = 2018;

执行上面查询语句,得到以下结果:
查询结果

在这个例子中:

  • PARTITION BY子句按行号将行划分为分区。
  • 对于每个分区(品牌名称),ORDER BY子句按月对行进行排序。
  • 对于每个分区中的每一行,LEAD()函数返回以下行的净销售额。

在本教程中,学习了如何使用SQL Server LEAD()函数访问当前行之后的特定物理偏移量的行。


上一篇: SQL Server Window函数 下一篇:无