Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL ServerAzure
SQL DatabaseAzure
SQL Managed InstanceAzure
Synapse Analytics
SQL do Azure no Edge
SQL analytics endpoint in Microsoft FabricWarehouse
no banco de dados Microsoft FabricSQL
no Microsoft Fabric
Retorna o último valor de um conjunto ordenado de valores.
Convenções de sintaxe de Transact-SQL
Sintaxe
LAST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
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 resulta em um único valor. Outras funções analíticas não são permitidas.
[ IGNORAR NULLS | RESPEITO NULLS ]
aplica-se a: SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e SQL do Azure no Edge
IGNORE NULLS - Ignore valores nulos no conjunto de dados ao calcular o último valor em uma partição.
RESPECT NULLS - Respeite os valores nulos no conjunto de dados ao calcular o último valor em uma partição.
RESPECT NULLS é o comportamento padrão se uma opção NULLS não for especificada.
Para obter mais informações sobre esse argumento no SQL do Azure no Edge, consulte Imputando valores ausentes.
CÂMBIO ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
A partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM em partições às 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.
A order_by_clause determina a ordem dos dados antes que a função seja aplicada. order_by_clause é obrigatória.
rows_range_clause limita ainda mais as linhas dentro da partição com a especificação de pontos iniciais e finais.
Para obter mais informações, confira Cláusula OVER (Transact-SQL).
Tipos de retorno
O mesmo tipo que scalar_expression.
Comentários
LAST_VALUE é não determinístico. Para obter mais informações, confira Funções determinísticas e não determinísticas.
Exemplos
a. Usar 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 (Rate). A cláusula PARTITION BY particiona os funcionários por departamento e a função LAST_VALUE é aplicada a cada partição de modo independente. 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 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');
Veja a seguir 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. Usar 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 do trimestre atual e do 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 o subtrai do valor da cota de vendas do trimestre atual. Ele retorna a coluna derivada intitulada DifferenceFromFirstQuarter. Durante o primeiro trimestre de um ano, o valor da coluna DifferenceFromFirstQuarter é 0. A função LAST_VALUE retorna o valor da cota de vendas do último trimestre do ano e o subtrai do valor da cota de vendas do trimestre atual. Ele retorna na coluna derivada intitulada DifferenceFromLastQuarter. Para o último trimestre do ano, o valor da coluna DifferenceFromLastQuarter é 0.
A cláusula RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING é necessária nesse exemplo para que valores diferentes de zero sejam retornados na coluna DifferenceFromLastQuarter. O intervalo padrão é RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Neste exemplo, o uso daquele intervalo padrão (ou a não inclusão de um intervalo, resultando no uso do padrão) resultaria em zeros retornados na coluna DifferenceFromLastQuarter. Para obter mais informações, confira Cláusula 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;
Veja a seguir 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