LAST_VALUE (Transact-SQL)
Si applica a: SQL Serverdatabase SQL di Azure Istanza gestita di SQL di Azure azure Synapse Analytics Platform System (PDW) azure SQL Edge SQL Analyticsendpoint in Microsoft FabricWarehouse in Microsoft Fabric
Restituisce l'ultimo valore in un set ordinato di valori.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
Argomenti
scalar_expression
Valore da restituire. scalar_expression può essere una colonna, una sottoquery o un'altra espressione che restituisce un solo valore. Altre funzioni analitiche non sono consentite.
[ IGNORE NULLS | RESPECT NULLS ] **
si applica a: SQL Server 2022 (16.x) e versioni successive, database SQL di Azure, Istanza gestita di SQL di Azure e SQL Edge di Azure
IGNORE NULLS
- Ignorare i valori Null nel set di dati durante il calcolo dell'ultimo valore su una partizione.
RESPECT NULLS
- Rispettare i valori Null nel set di dati durante il calcolo dell'ultimo valore su una partizione.
RESPECT NULLS
è il comportamento predefinito se non è specificata un'opzione NULLS.
Per altre informazioni su questo argomento in SQL Edge di Azure, vedere Imputazione di valori mancanti.
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
partition_by_clause suddivide il set di risultati generato dalla clausola FROM in partizioni alle quali viene applicata la funzione. Se non specificato, la funzione tratta tutte le righe del set di risultati della query come un unico gruppo.
order_by_clause determina l'ordine dei dati prima che venga applicata la funzione. order_by_clause è obbligatorio.
rows_range_clause limita ulteriormente le righe all'interno della partizione specificando i punti iniziali e finali.
Per altre informazioni, vedere Clausola OVER (Transact-SQL).
Tipi restituiti
Stesso tipo di scalar_expression.
Osservazioni:
LAST_VALUE
è non deterministico. Per altre informazioni, vedere Funzioni deterministiche e non deterministiche.
Esempi
R. Usare LAST_VALUE su partizioni
Nell'esempio seguente viene restituita la data di assunzione dell'ultimo dipendente in ogni reparto per lo stipendio specificato (valore Rate
). La clausola PARTITION BY
suddivide i dipendenti in base al reparto e la funzione LAST_VALUE
viene applicata indipendentemente a ogni partizione. La clausola ORDER BY
specificata nella clausola OVER
determina l'ordine logico in cui la funzione LAST_VALUE
viene applicata alle righe in ogni partizione.
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');
Il set di risultati è il seguente.
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. Usare FIRST_VALUE e LAST_VALUE in un'espressione calcolata
Nell'esempio seguente vengono usate le funzioni FIRST_VALUE
e LAST_VALUE
nelle espressioni calcolate per mostrare la differenza tra il valore della quota vendite per il trimestre corrente e il primo e ultimo trimestre dell'anno rispettivamente per un numero specificato di dipendenti. La funzione FIRST_VALUE
restituisce il valore delle quote vendite per il primo trimestre dell'anno e lo sottrae dal valore delle quote vendite per il trimestre corrente. Restituisce la colonna derivata denominata DifferenceFromFirstQuarter
. Per il primo trimestre dell'anno il valore della colonna DifferenceFromFirstQuarter
è 0. La funzione LAST_VALUE
restituisce il valore delle quote vendite per l'ultimo trimestre dell'anno e lo sottrae dal valore delle quote vendite per il trimestre corrente. Restituisce nella colonna derivata intitolata DifferenceFromLastQuarter
. Per l'ultimo trimestre dell'anno il valore della colonna DifferenceFromLastQuarter
è 0.
La clausola RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
è necessaria in questo esempio per restituire i valori diversi da zero nella DifferenceFromLastQuarter
colonna . L'intervallo predefinito è RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. Se nell'esempio si usa l'intervallo predefinito in questione, o se non si include alcun intervallo determinando quindi l'uso dell'intervallo predefinito, nella colonna DifferenceFromLastQuarter
verranno restituiti valori pari a zero. Per altre informazioni, vedere Clausola 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;
Il set di risultati è il seguente.
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