LAST_VALUE (Transact-SQL)
Retourne la dernière valeur dans un jeu de valeurs ordonné dans SQL Server 2012.
Conventions de la syntaxe Transact-SQL
Syntaxe
LAST_VALUE ( [scalar_expression )
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.OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
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.order_by_clause détermine l'ordre des données avant que la fonction soit appliquée. La valeur order_by_clause est obligatoire. 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 des valeurs retournés
Même type que scalar_expression.
Exemples
A. Utilisation de LAST_VALUE sur les partitions
L'exemple suivant retourne la date d'embauche du dernier employé dans chaque service pour le salaire donné (taux). La clause PARTITION BY décompose les employés par département 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 dans chaque partition.
USE AdventureWorks2012;
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 l'ensemble des résultats.
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. Utilisation de 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 est retournée dans 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 de quota de ventes pour le dernier trimestre de l'année et la soustrait de la valeur actuelle de quota de ventes du trimestre actuel. Elle est retournée dans la colonne dérivée intitulée DifferenceFromLastQuarter. Pour le dernier trimestre de l'année, la valeur de la colonne DifferenceFromLastQuarter est 0.
La clause RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING est requise dans cet exemple pour les valeurs non nulles à retourner dans la colonne DifferenceFromLastQuarter, comme illustré ci-dessous. 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 AdventureWorks2012;
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 l'ensemble des résultats.
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
(20 row(s) affected)