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函數 下一篇:無