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 )
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
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
SELECT OrderDate, ProductID, Quantity,
LAG(OrderDate, 1, OrderDate)
OVER (PARTITION BY ProductID ORDER BY OrderDate)
AS Last_OrderDate
FROM #Orders
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
SELECT OrderDate, ProductID, Quantity,
LEAD(OrderDate, 1, OrderDate)
OVER (PARTITION BY ProductID ORDER BY OrderDate)
AS Next_OrderDate
FROM #Orders
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
Comente e interaja!