LAST_VALUE (Transact-SQL)
S’applique à : point de terminaison Azure SQL Edge SQL Analytics Analytics Platform System (PDW) Azure SQL Database Azure SQL Database Azure Synapse Analytics Platform System (PDW) dans Microsoft Fabric Warehouse
Retourne la dernière valeur dans un jeu de valeurs ordonné.
Conventions de la syntaxe Transact-SQL
Syntaxe
LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
Arguments
scalar_expression
Valeur à retourner. scalar_expression peut être une colonne, une sous-requête ou une autre expression qui aboutit à une valeur unique. Les autres fonctions analytiques ne sont pas autorisées.
[ IGNORER NULLS | RESPECT NULLS ] **
S’applique à : SQL Server (à compter de SQL Server 2022 (16.x)), Azure SQL Database, Azure SQL Managed Instance, Azure SQL Edge
IGNORE NULLS
- Ignorez les valeurs Null dans le jeu de données lors du calcul de la dernière valeur sur une partition.
RESPECT NULLS
- Respectez les valeurs null dans le jeu de données lors de l’informatique de la dernière valeur sur une partition. RESPECT NULLS
est le comportement par défaut si aucune option NULLS n’est spécifiée.
Pour plus d’informations sur cet argument dans Azure SQL Edge, consultez Entrée de valeurs manquantes.
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
La fonction partition_by_clause divise le jeu de résultats généré par la clause FROM en partitions auxquelles la fonction est appliquée. S'il n'est pas spécifié, la fonction gère toutes les lignes du jeu de résultats de la requête en un seul groupe.
Le order_by_clause détermine l’ordre des données avant que la fonction ne soit appliquée. order_by_clause est requis.
La fonction rows_range_clause limite davantage les lignes dans la partition en spécifiant les points de départ et de terminaison.
Pour plus d’informations, consultez Clause OVER (Transact-SQL).
Types de retour
Type similaire à celui de scalar_expression.
Notes
LAST_VALUE
n’est pas déterministe. Pour plus d’informations, consultez Fonctions déterministes et non déterministes.
Exemples
R. Utiliser LAST_VALUE sur les partitions
L'exemple suivant retourne la date d'embauche du dernier employé dans chaque service pour le salaire donné (Rate
). La clause PARTITION BY
répartit les employés par service et la fonction LAST_VALUE
est appliquée à chaque partition indépendamment. La clause ORDER BY
spécifiée dans la clause OVER
détermine l'ordre logique dans lequel la fonction LAST_VALUE
est appliquée aux lignes de chaque 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');
Voici le jeu de résultats obtenu.
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. Utiliser FIRST_VALUE et LAST_VALUE dans une expression calculée
L'exemple suivant utilise les fonctions FIRST_VALUE
et LAST_VALUE
dans des expressions calculées pour afficher la différence entre la valeur de quota de ventes pour le trimestre actuel et, respectivement, le premier trimestre et le dernier trimestre de l'année pour un nombre donné d'employés. La fonction FIRST_VALUE
retourne la valeur du quota de ventes pour le premier trimestre de l'année et la soustrait de la valeur du quota de ventes du trimestre en cours. Elle retourne la colonne dérivée intitulée DifferenceFromFirstQuarter
. Pour le premier trimestre d'une année, la valeur de la colonne DifferenceFromFirstQuarter
est 0. La fonction LAST_VALUE
retourne la valeur du quota de ventes pour le dernier trimestre de l'année et la soustrait de la valeur du quota de ventes du trimestre en cours. Elle retourne dans la colonne dérivée intitulée DifferenceFromLastQuarter
. Pour le dernier trimestre d'une année, la valeur de la colonne DifferenceFromLastQuarter
est 0.
La clause RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
est obligatoire dans cet exemple pour que les valeurs non nulle soient retournées dans la colonne DifferenceFromLastQuarter
. La plage par défaut est RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. Dans cet exemple, l'utilisation de la plage par défaut (ou le fait de ne pas inclure de plage, ce qui entraînerait l'utilisation de la plage par défaut) provoquerait le renvoi de valeurs nulles dans la colonne DifferenceFromLastQuarter
. Pour plus d’informations, consultez Clause 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;
Voici le jeu de résultats obtenu.
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