在本教學中,將學習如何使用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函數
下一篇:無