Delen via


LAST_VALUE (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW) Azure SQL Edge SQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft Fabric

Retourneert de laatste waarde in een geordende set waarden.

Transact-SQL syntaxisconventies

Syntaxis

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

Argumenten

scalar_expression

De waarde die moet worden geretourneerd. scalar_expression kan een kolom, subquery of andere expressie zijn die resulteert in één waarde. Andere analytische functies zijn niet toegestaan.

[ NULL-WAARDEN NEGEREN | RESPECT NULLS ] **

Van toepassing op: SQL Server 2022 (16.x) en latere versies, Azure SQL Database, Azure SQL Managed Instance en Azure SQL Edge

IGNORE NULLS: null-waarden in de gegevensset negeren bij het berekenen van de laatste waarde via een partitie.

RESPECT NULLS: respecteer null-waarden in de gegevensset bij het berekenen van de laatste waarde voor een partitie. RESPECT NULLS is het standaardgedrag als er geen NULLS-optie is opgegeven.

Zie Ontbrekende waardeninvoeren voor meer informatie over dit argument in Azure SQL Edge.

OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

De partition_by_clause verdeelt de resultatenset die door de FROM-component wordt geproduceerd in partities waarop de functie wordt toegepast. Als deze niet is opgegeven, behandelt de functie alle rijen van de queryresultatenset als één groep.

De order_by_clause bepaalt de volgorde van de gegevens voordat de functie wordt toegepast. De order_by_clause is vereist.

De rows_range_clause beperkt de rijen binnen de partitie verder door begin- en eindpunten op te geven.

Zie OVER-component (Transact-SQL) voor meer informatie.

Retourtypen

Hetzelfde type als scalar_expression.

Opmerkingen

LAST_VALUE is niet-deterministisch. Zie Deterministische en niet-deterministische functiesvoor meer informatie.

Voorbeelden

Een. LAST_VALUE over partities gebruiken

In het volgende voorbeeld wordt de huurdatum van de laatste werknemer in elke afdeling geretourneerd voor het opgegeven salaris (Rate). De PARTITION BY component partitioneert de werknemers per afdeling en de LAST_VALUE functie wordt onafhankelijk van elke partitie toegepast. De ORDER BY component die is opgegeven in de OVER component bepaalt de logische volgorde waarin de LAST_VALUE functie wordt toegepast op de rijen in elke partitie.

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

Dit is de resultatenset.

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. Gebruik FIRST_VALUE en LAST_VALUE in een berekende expressie

In het volgende voorbeeld worden de functies FIRST_VALUE en LAST_VALUE in berekende expressies gebruikt om het verschil weer te geven tussen de verkoopquotumwaarde voor het huidige kwartaal en het eerste en laatste kwartaal van het jaar voor een bepaald aantal werknemers. De functie FIRST_VALUE retourneert de verkoopquotumwaarde voor het eerste kwartaal van het jaar en trekt deze af van de verkoopquotumwaarde voor het huidige kwartaal. Het retourneert de afgeleide kolom met de titel DifferenceFromFirstQuarter. Voor het eerste kwartaal van een jaar is de waarde van de kolom DifferenceFromFirstQuarter 0. De functie LAST_VALUE retourneert de verkoopquotumwaarde voor het laatste kwartaal van het jaar en trekt deze af van de verkoopquotumwaarde voor het huidige kwartaal. Deze retourneert in de afgeleide kolom met de titel DifferenceFromLastQuarter. Voor het laatste kwartaal van een jaar is de waarde van de kolom DifferenceFromLastQuarter 0.

De component RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING is vereist in dit voorbeeld voor de niet-nulwaarden die moeten worden geretourneerd in de kolom DifferenceFromLastQuarter. Het standaardbereik is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. In dit voorbeeld zou het gebruik van dat standaardbereik (of het niet opnemen van een bereik, wat resulteert in de standaardwaarde die wordt gebruikt), ertoe leiden dat nullen worden geretourneerd in de kolom DifferenceFromLastQuarter. Zie OVER-component (Transact-SQL) voor meer informatie.

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;

Dit is de resultatenset.

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