Funkcje LAG i LEAD – sięganie do poprzedniego i następnego rekordu

17-Lis-2012

W zapytaniach SQL musisz czasami sięgnąć do wartości z poprzedniego lub następnego rekordu. W SQL 2012 służą do tego funkcje LAG (poprzedni rekord) oraz LEAD (następny rekord). Popatrz na przykład:

USE tempdb;
GO

CREATE TABLE testlag
(Year INT,
Month INT,
Value INT)
GO

INSERT testlag VALUES
(2012,1,1000),
(2012,2,2000),
(2012,3,3000),
(2012,4,4000),
(2013,1,5000),
(2013,2,6000),
(2013,4,7000);

Mamy tabelkę prezentującą wartości dla kolejnych lat i miesięcy. Jeżeli w ramach wyświetlonego rekordu chcesz zobaczyć nie tylko bieżącą wartość z bieżącego rekordu, ale i z poprzedniego napisz:

SELECT Year, Month, Value,
LAG(Value,1,0) OVER (PARTITION BY Year ORDER BY Year,Month) As ‚Previous month’
FROM testlag

Parametry funkcji:

  • Której kolumny szukasz (tutaj Value)
  • O ile należy się przesunąć (1 oznacza o jeden rekord)
  • Co należy wyświetlić, jeżeli poprzedniego rekordu nie ma (tutaj zero)

Dodatkowo klauzula OVER pozwala Ci zdefiniować co to znaczy poprzedni/następny rekord – tutaj poukładaj w grupach wg lat sortując wg miesięcy)

Podobnie, tylko w drugą stronę (czyli szuka następnego miesiąca) działa funkcja TSQL LEAD:

SELECT Year, Month, Value,
LEAD(Value,1,0) OVER (PARTITION BY Year ORDER BY Year,Month) As ‚Next month’
FROM testlag

Dodaj komentarz:

Autor: Rafał Kraik