在本教程中,将学习如何使用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()
函数访问当前行之后的特定物理偏移量的行。