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