LAST_VALUE (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の Azure SQL Edge
SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
順序付けられた値のセットで最後の値を返します。
構文
LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
scalar_expression
返される値。 scalar_expression 列、サブクエリ、または 1 つの値となるその他の式を指定できます。 他の分析関数は指定できません。
[ IGNORE NULLS |RESPECT NULLS ] **
適用対象: SQL Server (SQL Server 2022 (16.x) 以降)、Azure SQL Database、Azure SQL Managed Instance、Azure SQL Edge
IGNORE NULLS
- パーティションの最後の値を計算するときに、データセット内の null 値を無視します。
RESPECT NULLS
- パーティションに対して最後の値を計算するときは、データセット内の null 値を考慮します。 RESPECT NULLS
は、NULLS オプションが指定されていない場合の既定の動作です。
Azure SQL Edge のこの引数の詳細については、「欠損値の補完」を参照してください。
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
partition_by_clause は、FROM 句で生成された結果セットをパーティションに分割します。このパーティションに関数が適用されます。 指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。
order_by_clause は、関数を適用する前にデータの順序を決定します。 order_by_clause が必要です。
rows_range_clause は始点と終点を指定することによって、パーティション内の行をさらに制限します。
詳細については、OVER 句 (Transact-SQL) に関する記事を参照してください。
戻り値の型
scalar_expression と同じ型。
解説
LAST_VALUE
は非決定的です。 詳細については、「決定的関数と非決定的関数」を参照してください。
例
A. パーティションで LAST_VALUE を使用する
次の例では、特定の給与 (Rate
) について各部門の最後の従業員の採用日を返します。 PARTITION BY
句によって部門ごとに従業員がパーティションに分割され、各パーティションに個別に LAST_VALUE
関数が適用されます。 OVER
句に指定された ORDER BY
句は、各パーティション内の行に LAST_VALUE
関数が適用される論理的な順序を決定します。
USE AdventureWorks2022;
GO
SELECT Department,
LastName,
Rate,
HireDate,
LAST_VALUE(HireDate) OVER (
PARTITION BY Department ORDER BY Rate
) AS LastValue
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS eph
ON eph.BusinessEntityID = edh.BusinessEntityID
INNER JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services', N'Document Control');
結果セットは次のようになります。
Department LastName Rate HireDate LastValue
--------------------------- ----------------------- ------------ ---------- ----------
Document Control Chai 10.25 2003-02-23 2003-03-13
Document Control Berge 10.25 2003-03-13 2003-03-13
Document Control Norred 16.8269 2003-04-07 2003-01-17
Document Control Kharatishvili 16.8269 2003-01-17 2003-01-17
Document Control Arifin 17.7885 2003-02-05 2003-02-05
Information Services Berg 27.4038 2003-03-20 2003-01-24
Information Services Meyyappan 27.4038 2003-03-07 2003-01-24
Information Services Bacon 27.4038 2003-02-12 2003-01-24
Information Services Bueno 27.4038 2003-01-24 2003-01-24
Information Services Sharma 32.4519 2003-01-05 2003-03-27
Information Services Connelly 32.4519 2003-03-27 2003-03-27
Information Services Ajenstat 38.4615 2003-02-18 2003-02-23
Information Services Wilson 38.4615 2003-02-23 2003-02-23
Information Services Conroy 39.6635 2003-03-08 2003-03-08
Information Services Trenary 50.4808 2003-01-12 2003-01-12
B. 計算された式で FIRST_VALUE と LAST_VALUE を使用する
次の例では、計算された式で FIRST_VALUE
関数と LAST_VALUE
関数を使用して、指定された人数の従業員について、その年の現在の四半期の販売ノルマの値と第 1 四半期および第 4 四半期の販売ノルマの値の差をそれぞれ示します。 FIRST_VALUE
関数は、その年の第 1 四半期の販売ノルマの値を返し、その値を現在の四半期の販売ノルマの値から引きます。 DifferenceFromFirstQuarter
という名前の派生列が返されます。 その年の第 1 四半期については、DifferenceFromFirstQuarter
列の値は 0 です。 LAST_VALUE
関数は、その年の第 4 四半期の販売ノルマの値を返し、その値を現在の四半期の販売ノルマの値から引きます。 DifferenceFromLastQuarter
という名前の派生列が返されます。 その年の第 4 四半期については、DifferenceFromLastQuarter
列の値は 0 です。
この例では、DifferenceFromLastQuarter
列でゼロ以外の値を返すには、"RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
" 句が必要です。 既定の範囲は RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
です。 この例では、この既定の範囲を使用した場合 (または、範囲を含めない結果、既定値が使用される場合)、DifferenceFromLastQuarter
列にゼロが返されます。 詳細については、OVER 句 (Transact-SQL) に関する記事を参照してください。
USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
DATEPART(QUARTER, QuotaDate) AS Quarter,
YEAR(QuotaDate) AS SalesYear,
SalesQuota AS QuotaThisQuarter,
SalesQuota - FIRST_VALUE(SalesQuota) OVER (
PARTITION BY BusinessEntityID,
YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, QuotaDate)
) AS DifferenceFromFirstQuarter,
SalesQuota - LAST_VALUE(SalesQuota) OVER (
PARTITION BY BusinessEntityID,
YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, QuotaDate) RANGE BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING
) AS DifferenceFromLastQuarter
FROM Sales.SalesPersonQuotaHistory
WHERE YEAR(QuotaDate) > 2005
AND BusinessEntityID BETWEEN 274
AND 275
ORDER BY BusinessEntityID,
SalesYear,
Quarter;
結果セットは次のようになります。
BusinessEntityID Quarter SalesYear QuotaThisQuarter DifferenceFromFirstQuarter DifferenceFromLastQuarter
---------------- ----------- ----------- --------------------- --------------------------- -----------------------
274 1 2006 91000.00 0.00 -63000.00
274 2 2006 140000.00 49000.00 -14000.00
274 3 2006 70000.00 -21000.00 -84000.00
274 4 2006 154000.00 63000.00 0.00
274 1 2007 107000.00 0.00 -9000.00
274 2 2007 58000.00 -49000.00 -58000.00
274 3 2007 263000.00 156000.00 147000.00
274 4 2007 116000.00 9000.00 0.00
274 1 2008 84000.00 0.00 -103000.00
274 2 2008 187000.00 103000.00 0.00
275 1 2006 502000.00 0.00 -822000.00
275 2 2006 550000.00 48000.00 -774000.00
275 3 2006 1429000.00 927000.00 105000.00
275 4 2006 1324000.00 822000.00 0.00
275 1 2007 729000.00 0.00 -489000.00
275 2 2007 1194000.00 465000.00 -24000.00
275 3 2007 1575000.00 846000.00 357000.00
275 4 2007 1218000.00 489000.00 0.00
275 1 2008 849000.00 0.00 -20000.00
275 2 2008 869000.00 20000.00 0.00