対象者:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
アナリティクスプラットフォームシステム(PDW)
Azure SQL Edge
SQL Analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
順序付けられた値のセットで最後の値を返します。
構文
LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
引数
scalar_expression
返される値。 scalar_expression 列、サブクエリ、または 1 つの値となるその他の式を指定できます。 他の分析関数は指定できません。
[ IGNORE NULLS |RESPECT NULLS ] **
に適用: 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 のこの引数の詳細については、「欠損値の補完」を参照してください。
オーバー([ 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 関数が適用されます。
ORDER BY 句に指定された OVER 句は、各パーティション内の行に 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 です。
この例では、RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 列でゼロ以外の値を返すには、"DifferenceFromLastQuarter" 句が必要です。 既定の範囲は 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