Dela via


LAST_VALUE (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW) Azure SQL Edge SQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft Fabric

Returnerar det sista värdet i en ordnad uppsättning värden.

Transact-SQL syntaxkonventioner

Syntax

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

Argument

scalar_expression

Värdet som ska returneras. scalar_expression kan vara en kolumn, underfråga eller ett annat uttryck som resulterar i ett enda värde. Andra analysfunktioner är inte tillåtna.

[ IGNORERA NULLS | RESPECT NULLS ] **

gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database, Azure SQL Managed Instance och Azure SQL Edge

IGNORE NULLS – Ignorera null-värden i datamängden när du beräknar det senaste värdet över en partition.

RESPECT NULLS – Respektera null-värden i datauppsättningen när du beräknar det senaste värdet över en partition. RESPECT NULLS är standardbeteendet om inget NULLS-alternativ har angetts.

Mer information om det här argumentet i Azure SQL Edge finns i Imputing missing values.

ÖVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

partition_by_clause delar upp resultatuppsättningen som skapas av FROM-satsen i partitioner som funktionen tillämpas på. Om det inte anges behandlar funktionen alla rader i frågeresultatuppsättningen som en enda grupp.

order_by_clause avgör ordningen på data innan funktionen tillämpas. order_by_clause krävs.

rows_range_clause begränsar raderna i partitionen ytterligare genom att ange start- och slutpunkter.

Mer information finns i OVER-satsen (Transact-SQL).

Returtyper

Samma typ som scalar_expression.

Anmärkningar

LAST_VALUE är icke-terministisk. Mer information finns i deterministiska och icke-terministiska funktioner.

Exempel

A. Använda LAST_VALUE över partitioner

I följande exempel returneras anställningsdatumet för den senaste medarbetaren på varje avdelning för den angivna lönen (Rate). Satsen PARTITION BY partitioner anställda efter avdelning och funktionen LAST_VALUE tillämpas på varje partition separat. Den ORDER BY-sats som anges i OVER-satsen avgör i vilken logisk ordning funktionen LAST_VALUE tillämpas på raderna i varje partition.

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');

Här är resultatuppsättningen.

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. Använda FIRST_VALUE och LAST_VALUE i ett beräknat uttryck

I följande exempel används funktionerna FIRST_VALUE och LAST_VALUE i beräknade uttryck för att visa skillnaden mellan försäljningskvotvärdet för innevarande kvartal respektive årets första respektive sista kvartal för ett visst antal anställda. Funktionen FIRST_VALUE returnerar försäljningskvotvärdet för årets första kvartal och subtraherar det från försäljningskvotvärdet för det aktuella kvartalet. Den returnerar den härledda kolumnen med titeln DifferenceFromFirstQuarter. För det första kvartalet på ett år är värdet för kolumnen DifferenceFromFirstQuarter 0. Funktionen LAST_VALUE returnerar försäljningskvotvärdet för årets sista kvartal och subtraherar det från försäljningskvotvärdet för det aktuella kvartalet. Den returnerar i den härledda kolumnen med titeln DifferenceFromLastQuarter. För det sista kvartalet i ett år är värdet för kolumnen DifferenceFromLastQuarter 0.

Satsen RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING krävs i det här exemplet för att värdena som inte är noll ska returneras i kolumnen DifferenceFromLastQuarter. Standardintervallet är RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. I det här exemplet skulle det leda till att nollor returneras i kolumnen DifferenceFromLastQuarter om du använder standardintervallet (eller inte inkluderar ett intervall, vilket resulterar i att standardvärdet används). Mer information finns i OVER-satsen (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;

Här är resultatuppsättningen.

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