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