LAST_VALUE(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server Azure SQL DatabaseAzure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)Azure SQL Edge SQL 분석 엔드포인트
정렬된 값 집합의 마지막 값을 반환합니다.
구문
LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
인수
scalar_expression
반환되는 값입니다. scalar_expression은 열, 하위 쿼리 또는 결과로 반환되는 값이 하나뿐인 다른 식일 수 있습니다. 다른 분석 함수는 사용할 수 없습니다.
[ 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에서 이 인수에 대한 자세한 내용은 누락된 값의 대체를 참조 하세요.
OVER( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
partition_by_clause는 FROM 절이 생성한 결과 집합을 함수가 적용되는 파티션으로 나눕니다. 지정하지 않을 경우 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급됩니다.
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
함수를 사용하여 지정된 직원들의 해당 연도 현재 분기 및 첫 분기와 마지막 분기의 분기별 판매 할당량 값의 차이를 각각 표시합니다.
FIRST_VALUE
함수는 해당 연도의 첫 분기의 판매 할당량 값을 반환하고 현재 분기의 판매 할당량 값에서 이 값을 뺍니다. 라는 파생 열을 반환합니다 DifferenceFromFirstQuarter
. 연도의 첫 번째 분기인 경우 DifferenceFromFirstQuarter
열의 값은 0입니다.
LAST_VALUE
함수는 해당 연도의 마지막 분기에 대한 판매 할당량 값을 반환하고, 현재 분기의 판매 할당량 값에서 이 값을 뺍니다. 파생 열에 라는 제목으로 반환됩니다 DifferenceFromLastQuarter
. 연도의 마지막 분기인 경우 DifferenceFromLastQuarter
열의 값은 0입니다.
이 예제에서는 0이 아닌 값이 열에 반환되려면 절 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
이 DifferenceFromLastQuarter
필요합니다. 기본 범위는 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
입니다. 이 예제에서는 기본 범위를 사용하여(또는 범위를 포함하지 않아 기본값이 사용되도록 함) DifferenceFromLastQuarter
열에 0이 반환됩니다. 자세한 내용은 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