LAG (Transact-SQL)LAG (Transact-SQL)

ESTE TÓPICO APLICA-SE A:simSQL Server (a partir de 2012)simAzure SQL DatabasesimAzure SQL Data Warehouse simParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Acessa os dados de uma linha anterior no mesmo conjunto de resultados sem usar uma autojunção começando com SQL Server 2012 (11.x)SQL Server 2012 (11.x).Accesses data from a previous row in the same result set without the use of a self-join starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x). LAG fornece acesso a uma linha a um determinado deslocamento físico que antecede a linha atual.LAG provides access to a row at a given physical offset that comes before the current row. Use essa função analítica em uma instrução SELECT para comparar valores na linha atual com valores em uma linha anterior.Use this analytic function in a SELECT statement to compare values in the current row with values in a previous row.

Ícone de link do tópico Convenções da sintaxe Transact-SQL (Transact-SQL)Topic link icon Transact-SQL Syntax Conventions (Transact-SQL)

SintaxeSyntax

LAG (scalar_expression [,offset] [,default])  
    OVER ( [ partition_by_clause ] order_by_clause )  

ArgumentosArguments

scalar_expressionscalar_expression
O valor a ser retornado com base no deslocamento especificado.The value to be returned based on the specified offset. É uma expressão de qualquer tipo que retorna um único valor (escalar).It is an expression of any type that returns a single (scalar) value. scalar_expression não pode ser uma função analítica.scalar_expression cannot be an analytic function.

offsetoffset
O número de linhas atrás da linha atual da qual obter um valor.The number of rows back from the current row from which to obtain a value. Se não for especificado, o padrão será 1.If not specified, the default is 1. offset pode ser uma coluna, subconsulta ou outra expressão avaliada para um inteiro positivo ou pode ser convertida implicitamente em bigint.offset can be a column, subquery, or other expression that evaluates to a positive integer or can be implicitly converted to bigint. offset não pode ser um valor negativo nem uma função analítica.offset cannot be a negative value or an analytic function.

defaultdefault
O valor a ser retornado quando scalar_expression em offset for NULL.The value to return when scalar_expression at offset is NULL. Se um valor padrão não for especificado, NULL será retornado.If a default value is not specified, NULL is returned. default pode ser uma coluna, subconsulta ou outra expressão, mas não pode ser uma função analítica.default can be a column, subquery, or other expression, but it cannot be an analytic function. default deve ter o tipo compatível com scalar_expression.default must be type-compatible with scalar_expression.

OVER ( [ partition_by_clause ] order_by_clause)OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM em partições às quais a função é aplicada.partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. Se não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo.If not specified, the function treats all rows of the query result set as a single group. order_by_clause determina a ordem dos dados antes de a função ser aplicada.order_by_clause determines the order of the data before the function is applied. Se partition_by_clause for especificado, ela determinará a ordem dos dados na partição.If partition_by_clause is specified, it determines the order of the data in the partition. order_by_clause é obrigatória.The order_by_clause is required. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Tipos de retornoReturn Types

O tipo de dados da scalar_expression especificada.The data type of the specified scalar_expression. NULL será retornado se scalar_expression não permitir valor nulo ou default for definido como NULL.NULL is returned if scalar_expression is nullable or default is set to NULL.

Comentários geraisGeneral Remarks

LAG é não determinística.LAG is nondeterministic. Para obter mais informações, veja Funções determinísticas e não determinísticas.For more information, see Deterministic and Nondeterministic Functions.

ExemplosExamples

A.A. Comparar valores entre anosCompare values between years

O exemplo a seguir usa a função LAG para retornar a diferença em cotas de vendas para um funcionário específico nos anos anteriores.The following example uses the LAG function to return the difference in sales quotas for a specific employee over previous years. Observe que, como não há um valor de retardo disponível para a primeira linha, o padrão de zero (0) é retornado.Notice that because there is no lag value available for the first row, the default of zero (0) is returned.

USE AdventureWorks2012;  
GO  
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,   
       LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota  
FROM Sales.SalesPersonQuotaHistory  
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');  

Aqui está o conjunto de resultados.Here is the result set.

BusinessEntityID SalesYear   CurrentQuota          PreviousQuota  
---------------- ----------- --------------------- ---------------------  
275              2005        367000.00             0.00  
275              2005        556000.00             367000.00  
275              2006        502000.00             556000.00  
275              2006        550000.00             502000.00  
275              2006        1429000.00            550000.00  
275              2006        1324000.00            1429000.00  

B.B. Comparar valores dentro de partiçõesCompare values within partitions

O exemplo a seguir usa a função LAG para comparar as vendas no ano até o momento entre funcionários.The following example uses the LAG function to compare year-to-date sales between employees. A cláusula PARTITION BY é especificada para dividir as linhas no conjunto de resultados por território de vendas.The PARTITION BY clause is specified to divide the rows in the result set by sales territory. A função LAG é aplicada separadamente a cada partição e a computação é reiniciada para cada partição.The LAG function is applied to each partition separately and computation restarts for each partition. A cláusula ORDER BY na cláusula OVER ordena as linhas em cada partição.The ORDER BY clause in the OVER clause orders the rows in each partition. A cláusula ORDER BY na instrução SELECT classifica as linhas em todo o conjunto de resultados.The ORDER BY clause in the SELECT statement sorts the rows in the whole result set. Observe que, como não há um valor de retardo disponível para a primeira linha de cada partição, o padrão de zero (0) é retornado.Notice that because there is no lag value available for the first row of each partition, the default of zero (0) is returned.

USE AdventureWorks2012;  
GO  
SELECT TerritoryName, BusinessEntityID, SalesYTD,   
       LAG (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS PrevRepSales  
FROM Sales.vSalesPerson  
WHERE TerritoryName IN (N'Northwest', N'Canada')   
ORDER BY TerritoryName;  

Aqui está o conjunto de resultados.Here is the result set.

TerritoryName            BusinessEntityID SalesYTD              PrevRepSales  
-----------------------  ---------------- --------------------- ---------------------  
Canada                   282              2604540.7172          0.00  
Canada                   278              1453719.4653          2604540.7172  
Northwest                284              1576562.1966          0.00  
Northwest                283              1573012.9383          1576562.1966  
Northwest                280              1352577.1325          1573012.9383  

C.C. Especificando expressões arbitráriasSpecifying arbitrary expressions

O exemplo a seguir demonstra como especificar uma variedade de expressões arbitrárias na sintaxe da função LAG.The following example demonstrates specifying a variety of arbitrary expressions in the LAG function syntax.

CREATE TABLE T (a int, b int, c int);   
GO  
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);   

SELECT b, c,   
    LAG(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i  
FROM T;  

Aqui está o conjunto de resultados.Here is the result set.

b           c           i  
----------- ----------- -----------  
1           -3          1  
2           4           -2  
1           NULL        8  
3           1           -6  
2           NULL        NULL  
1           5           NULL  

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

D: Comparar valores entre trimestresD: Compare values between quarters

O exemplo a seguir demonstra a função LAG.The following example demonstrates the LAG function. A consulta usa a função LAG para retornar a diferença em cotas de vendas para um funcionário específico nos trimestres civis anteriores.The query uses the LAG function to return the difference in sales quotas for a specific employee over previous calendar quarters. Observe que, como não há um valor de retardo disponível para a primeira linha, o padrão de zero (0) é retornado.Notice that because there is no lag value available for the first row, the default of zero (0) is returned.

-- Uses AdventureWorks  

SELECT CalendarYear, CalendarQuarter, SalesAmountQuota AS SalesQuota,  
       LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS PrevQuota,  
       SalesAmountQuota - LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Diff  
FROM dbo.FactSalesQuota  
WHERE EmployeeKey = 272 AND CalendarYear IN (2001, 2002)  
ORDER BY CalendarYear, CalendarQuarter;   

Aqui está o conjunto de resultados.Here is the result set.

Year Quarter  SalesQuota  PrevQuota  Diff  
---- -------  ----------  ---------  -------------  
2001 3        28000.0000      0.0000   28000.0000  
2001 4         7000.0000  28000.0000  -21000.0000  
2001 1        91000.0000   7000.0000   84000.0000  
2002 2       140000.0000  91000.0000   49000.0000  
2002 3         7000.0000 140000.0000  -70000.0000  
2002 4       154000.0000   7000.0000   84000.0000

Consulte TambémSee Also

LEAD (Transact-SQL)LEAD (Transact-SQL)