LAST_VALUE (Transact-SQL)
Retorna o último valor em um conjunto ordenado de valores no SQL Server 2012.
Convenções de sintaxe Transact-SQL
Sintaxe
LAST_VALUE ( [scalar_expression )
OVER ( [ partition_by_clause ] order_by_clause rows_range_clause )
Argumentos
scalar_expression
É o valor a ser retornado. scalar_expression pode ser uma coluna, subconsulta ou outra expressão que resulte em um único valor. Outras funções analíticas não são permitidas.OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM em partições nas quais a função é aplicada. Se não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo.order_by_clause determina a ordem dos dados antes de a função ser aplicada. O order_by_clause é necessário. rows_range_clause limita adicionalmente as linhas dentro da partição com a especificação de pontos iniciais e finais. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).
Tipos de retorno
É o mesmo tipo que scalar_expression.
Exemplos
A. Usando LAST_VALUE em partições
O exemplo a seguir retorna a data de admissão do último funcionário em cada departamento para o determinado salário (Taxa). A cláusula PARTITION BY divide os funcionários por departamento e a função LAST_VALUE é aplicada independentemente a cada partição. A cláusula ORDER BY especificada na cláusula OVER determina a ordem lógica na qual a função LAST_VALUE é aplicada às linhas em cada partição.
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');
Aqui está o conjunto de resultados.
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. Usando FIRST_VALUE e LAST_VALUE em uma expressão computada
O exemplo a seguir usa as funções FIRST_VALUE e LAST_VALUE em expressões computadas para mostrar a diferença entre os valores de cota de vendas para o trimestre atual e o primeiro e último trimestre do ano respectivamente para um determinado número de funcionários. A função FIRST_VALUE retorna o valor da cota de vendas do primeiro trimestre do ano e subtrai do valor da cota de vendas do trimestre atual. Ele é retornado na coluna derivada intitulada DifferenceFromFirstQuarter. Para o primeiro trimestre do ano, o valor da coluna de DifferenceFromFirstQuarter é 0. A função LAST_VALUE retorna o valor da cota de vendas do último trimestre do ano e subtrai do valor da cota de vendas do trimestre atual. Ele é retornado na coluna derivada intitulada DifferenceFromLastQuarter. Para o último trimestre do ano, o valor da coluna de DifferenceFromLastQuarter é 0.
A cláusula "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" é necessária neste exemplo para os valores diferentes de zero a serem retornados na coluna DifferenceFromLastQuarter, conforme mostrado abaixo. O intervalo padrão é "RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW". Neste exemplo, usar aquele intervalo padrão (ou não incluir um intervalo, resultando no padrão que está sendo usado) resultaria em zeros retornados na coluna de DifferenceFromLastQuarter. Para obter mais informações, consulte Cláusula 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;
Aqui está o conjunto de resultados.
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)