LAST_VALUE(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPlatform System(PDW) Microsoft FabricWarehouse의 Azure SQL Edge SQL 분석 엔드포인트

정렬된 값 집합의 마지막 값을 반환합니다.

Transact-SQL 구문 표기 규칙

Syntax

LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
    OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

참고 항목

SQL Server 2014(12.x) 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조 하세요.

인수

scalar_expression

반환되는 값입니다. scalar_expression은 열, 하위 쿼리 또는 결과로 반환되는 값이 하나뿐인 다른 식일 수 있습니다. 다른 분석 함수는 사용할 수 없습니다.

[ 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 절이 생성한 결과 집합을 함수가 적용되는 파티션으로 나눕니다. 지정하지 않을 경우 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급됩니다.

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_VALUELAST_VALUE 함수를 사용하여 지정된 직원들의 해당 연도 현재 분기 및 첫 분기와 마지막 분기의 분기별 판매 할당량 값의 차이를 각각 표시합니다. FIRST_VALUE 함수는 해당 연도의 첫 분기의 판매 할당량 값을 반환하고 현재 분기의 판매 할당량 값에서 이 값을 뺍니다. 라는 파생 열을 반환합니다 DifferenceFromFirstQuarter. 연도의 첫 번째 분기인 경우 DifferenceFromFirstQuarter 열의 값은 0입니다. LAST_VALUE 함수는 해당 연도의 마지막 분기에 대한 판매 할당량 값을 반환하고, 현재 분기의 판매 할당량 값에서 이 값을 뺍니다. 파생 열에 라는 제목으로 반환됩니다 DifferenceFromLastQuarter. 연도의 마지막 분기인 경우 DifferenceFromLastQuarter 열의 값은 0입니다.

이 예제에서는 0이 아닌 값이 열에 반환되려면 절 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWINGDifferenceFromLastQuarter 필요합니다. 기본 범위는 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