LEAD (Transact-SQL)
SQL Server 2012 の自己結合を使用せずに同じ結果セットの後続の行からデータにアクセスします。 LEAD によって、現在の行の後に続く指定された物理的なオフセットの行にアクセスできます。 SELECT ステートメントでこの分析関数を使用して、現在の行の値と後続の行の値を比較します。
Transact-SQL 構文表記規則 (Transact-SQL)
構文
LEAD ( scalar_expression [ ,offset ] , [ default ] )
OVER ( [ partition_by_clause ] order_by_clause )
引数
scalar_expression
指定されたオフセットに基づいて返される値。 単一の (スカラー) 値を返す任意の型の式です。 scalar_expression は分析関数にはなりません。offset
値を取得する現在の行よりも前にある行の数。 指定しない場合は、1 が既定値です。 offset は、列、サブクエリ、または正の整数と評価されたり、暗黙的に bigint に変換される可能性があるその他の式です。 offset は、負の値または分析関数にはなりません。default
offset の scalar_expression が NULL の場合に返される値。 既定値を指定しない場合、NULL が返されます。 default には、列、サブクエリ、または式を指定できますが、分析関数は指定できません。 default には、scalar_expression の型との互換性が必要です。OVER ( [ partition_by_clause ] order_by_clause**)**
partition_by_clause は、FROM 句で生成された結果セットをパーティションに分割します。このパーティションに関数が適用されます。 指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。 order_by_clause は、関数を適用する前にデータの順序を決定します。 partition_by_clause が指定されると、各パーティションのデータの順序が決まります。 order_by_clause は必須です。 詳細については、「OVER 句 (Transact-SQL)」を参照してください。
戻り値の型
指定した scalar_expression のデータ型。 scalar_expression で NULL 値が許可されているか default が NULL に設定されていると、NULL が返されます。
使用例
A. 年間の値を比較します。
クエリでは、LEAD 関数を使用して後の数年間にわたる特定従業員の販売ノルマの差が返されます。 最後の行に使用できるリード値がないため、既定のゼロ (0) が返されることに注意してください。
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,
LEAD(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS NextQuota
FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');
以下に結果セットを示します。
BusinessEntityID SalesYear CurrentQuota NextQuota
---------------- ----------- --------------------- ---------------------
275 2005 367000.00 556000.00
275 2005 556000.00 502000.00
275 2006 502000.00 550000.00
275 2006 550000.00 1429000.00
275 2006 1429000.00 1324000.00
275 2006 1324000.00 0.00
B. パーティション内の値を比較します。
次の例では、LEAD 関数を使用して従業員間の今年に入ってからの売上高を比較します。 PARTITION BY 句を指定して、販売区域ごとに結果セットの行をパーティションに分割します。 LEAD 関数は各パーティションに対して個別に適用され、各パーティションで計算が再開されます。 OVER 句で指定した ORDER BY 句によって、関数が適用される前に各パーティションの行の順序が設定されます。 SELECT ステートメントの ORDER BY 句によって、結果セット全体で行の順序付けが行われます。 各パーティションの最後の行に使用できるリード値がないため、既定のゼロ (0) が返されることに注意してください。
USE AdventureWorks2012;
GO
SELECT TerritoryName, BusinessEntityID, SalesYTD,
LEAD (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS NextRepSales
FROM Sales.vSalesPerson
WHERE TerritoryName IN (N'Northwest', N'Canada')
ORDER BY TerritoryName;
以下に結果セットを示します。
TerritoryName BusinessEntityID SalesYTD NextRepSales
----------------------- ---------------- --------------------- ---------------------
Canada 282 2604540.7172 1453719.4653
Canada 278 1453719.4653 0.00
Northwest 284 1576562.1966 1573012.9383
Northwest 283 1573012.9383 1352577.1325
Northwest 280 1352577.1325 0.00
C. 任意の式を指定します。
次の例では、LEAD 関数の構文にさまざまな任意の式を指定する方法を示します。
CREATE TABLE T (a int, b int, c int);
GO
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);
SELECT b, c,
LEAD(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i
FROM T;
以下に結果セットを示します。
b c i
----------- ----------- -----------
1 -3 8
2 4 2
1 NULL 2
3 1 0
2 NULL NULL
1 5 -2