LAST_VALUE (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse AnalyticsPlatform System (PDW) Microsoft Fabric倉儲中的 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 受控執行個體、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。

此範例中需要 子句 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