SQL Server “Denali” – Funções Analíticas – LAG() e LEAD()

Compartilhe este artigo!

Sobre o autor

Entre em contato...

Redação ForumWeb

Redação ForumWeb Equipe de desenvolvimento do ForumWeb.com.br, responsável pelas dicas e downloads do site.

Site do autor: http://www.forumweb.com.br

Indique este artigo

Para

Seu email

Mensagem

Fechar
Personalize sua mensagem

Código

Arquivos relacionados

  • Por enquanto, nenhum arquivo para download.

SQL Server “Denali” – Funções Analíticas – LAG() e LEAD()

Segunda-Feira, 22 de Agosto de 2011 às 11:05

A função LAG() pode ser usada para acessar dados de uma linha anterior no conjunto de resultados sem o uso de uma auto associação. E a função LEAD() funciona de forma parecida, só acessa dados de uma linha subsequente no mesmo conjunto de resultados. Essas funções são introduzidas em “Denali”, como funções T-SQL.

As funções LAG() e LEAD()também estão disponíveis no Oracle desde o Oracle 8i.

A sintaxe para as funções é:

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

Onde:

  • offset: fornece o número de linhas para trás ou para frente da linha atual.
  • default: fornece um valor padrão, quando o valor retornado é NULL.

Para exemplificar as funções, vamos usar a tabela abaixo:

CREATE TABLE #Orders
(
       OrderDate     DATE,
       ProductID     INT,
       Quantity      INT
)
INSERT INTO #Orders VALUES
('2011-07-28',11,12), ('2011-03-18',12,74), ('2011-04-12',13,95),
('2011-07-25',14,57), ('2011-05-30',11,28), ('2011-05-21',10,12),
('2011-04-12',11,38)

SELECT OrderDate, ProductID, Quantity
FROM   #Orders

Resultado:

OrderDate	ProductID	 Quantity
———-		———–		 ———–
2011-07-28	11		 12
2011-03-18	12		 74
2011-04-12	13		 95
2011-07-25	14		 57
2011-05-30 	11		 28
2011-05-21 	10		 12
2011-04-12 	11		 38

Usando a LAG():

SELECT OrderDate, ProductID, Quantity,
       LAG(OrderDate, 1, OrderDate)
       OVER (PARTITION BY ProductID ORDER BY OrderDate)
       AS Last_OrderDate
FROM   #Orders

Resultado:

OrderDate	 ProductID	 Quantity	 Last_OrderDate
———-		 ———–		 ———–		 ————–
2011-05-21	 10		 12		 2011-05-21
2011-04-12	 11		 38		 2011-04-12
2011-05-30	 11		 28		 2011-04-12
2011-07-28	 11		 12		 2011-05-30
2011-03-18	 12		 74		 2011-03-18
2011-04-12	 13		 95		 2011-04-12
2011-07-25	 14		 57		 2011-07-25

Já com o LEAD():

SELECT OrderDate, ProductID, Quantity,
       LEAD(OrderDate, 1, OrderDate)
       OVER (PARTITION BY ProductID ORDER BY OrderDate)
       AS Next_OrderDate
FROM   #Orders

Resultado:

OrderDate	 ProductID	 Quantity	 Next_OrderDate
———-		 ———–		 ———–		 ————–
2011-05-21	 10		 12		 2011-05-21
2011-04-12	 11		 38		 2011-05-30
2011-05-30	 11		 28		 2011-07-28
2011-07-28	 11		 12		 2011-07-28
2011-03-18	 12		 74		 2011-03-18
2011-04-12	 13		 95		 2011-04-12
2011-07-25	 14		 57		 2011-07-25

Autor/Fonte: SQL & Me

Qual a sua opinião?

Comente e interaja!



Ainda sem comentários, comente!