Compartilhar via


LAST_VALUE (Transact-SQL)

Retorna o último valor em um conjunto ordenado de valores no SQL Server 2014.

Aplica-se a: SQL Server (do SQL Server 2012 à versão atual).

Ícone de vínculo de tópico Convenções da 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. A order_by_clause é obrigatória. 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.

Comentários gerais

LAST_VALUE é não determinística. Para obter mais informações, consulte Funções determinísticas e não determinísticas.

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 o subtrai do valor da cota de vendas para o trimestre atual. Ele é retornado na coluna derivada chamado de DifferenceFromFirstQuarter. Durante o primeiro trimestre de um 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 o subtrai do valor da cota de vendas para o trimestre atual. Ele é retornado na coluna derivada chamado de DifferenceFromLastQuarter. Durante o último trimestre de um ano, o valor da coluna de DifferenceFromLastQuarter é 0.

A cláusula que "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" é necessária neste exemplo para obter os valores diferentes de zero a serem retornados na coluna DifferenceFromLastQuarter, como mostrado abaixo. O intervalo padrão é "RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW." Neste exemplo, usar aquele intervalo padrão (ou não incluindo 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)