Share via


LAG (Transact-SQL)

SQL Server 2012 の自己結合を使用せずに同じ結果セットの前の行からデータにアクセスします。 LAG によって、現在の行の前にある指定された物理的なオフセットの行にアクセスできます。 SELECT ステートメントでこの分析関数を使用して、現在の行の値と前の行の値を比較します。

トピック リンク アイコン Transact-SQL 構文表記規則 (Transact-SQL)

構文

LAG (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. 年間の値を比較します。

次の例では、LAG 関数を使用して過去数年間にわたる特定の従業員の販売ノルマの差を返します。 最初の行に使用できるラグ値がないため、既定のゼロ (0) が返されることに注意してください。

USE AdventureWorks2012;
GO
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota, 
       LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota
FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');

以下に結果セットを示します。

BusinessEntityID SalesYear   CurrentQuota          PreviousQuota
---------------- ----------- --------------------- ---------------------
275              2005        367000.00             0.00
275              2005        556000.00             367000.00
275              2006        502000.00             556000.00
275              2006        550000.00             502000.00
275              2006        1429000.00            550000.00
275              2006        1324000.00            1429000.00

B. パーティション内の値を比較します。

次の例では、LAG 関数を使用して従業員間の今年に入ってからの売上高を比較します。 PARTITION BY 句を指定して、販売区域ごとに結果セットの行を分割します。 LAG 関数は各パーティションに対して個別に適用され、各パーティションで計算が再開されます。 OVER 句で指定した ORDER BY 句によって、各パーティション内の行の順序が決められます。 SELECT ステートメントの ORDER BY 句によって、結果セット全体で行の並べ替えが行われます。 各パーティションの最初の行に使用できるラグ値がないため、既定のゼロ (0) が返されることに注意してください。

USE AdventureWorks2012;
GO
SELECT TerritoryName, BusinessEntityID, SalesYTD, 
       LAG (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS PrevRepSales
FROM Sales.vSalesPerson
WHERE TerritoryName IN (N'Northwest', N'Canada') 
ORDER BY TerritoryName;

以下に結果セットを示します。

TerritoryName            BusinessEntityID SalesYTD              PrevRepSales
-----------------------  ---------------- --------------------- ---------------------
Canada                   282              2604540.7172          0.00
Canada                   278              1453719.4653          2604540.7172
Northwest                284              1576562.1966          0.00
Northwest                283              1573012.9383          1576562.1966
Northwest                280              1352577.1325          1573012.9383

C. 任意の式を指定します。

次の例では、LAG 関数の構文にさまざまな任意の式を指定する方法を示します。

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, 
    LAG(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i
FROM T;

以下に結果セットを示します。

b           c           i
----------- ----------- -----------
1           -3          1
2           4           -2
1           NULL        8
3           1           -6
2           NULL        NULL
1           5           NULL

関連項目

参照

LEAD (Transact-SQL)