이전 행을 가져오는 lag()와 이후 행을 가져오는 lead()

어떤 속성에 대해 특정 값의 이전 행과 이후 행을 구해야하는 경우가 있다

 

다음과 같이 테이블을 먼저 만들어보고

 

use igoat;

create table bill (
month DATE,
amount INT
);

INSERT INTO bill (month, amount) VALUES
('2024-01-01', 50000),
('2024-02-01', 52000),
('2024-03-01', 48000),
('2024-04-01', 50500),
('2024-05-01', 53000),
('2024-06-01', 51000),
('2024-07-01', 52500);

SELECT * FROM bill;

 

 

 

 

 

각 월마다 이전 월의 금액, 이후 월의 금액을 알아 비교해보고 싶을 때가 있다

 

lag(속성) over (order by (정렬기준))  해당 속성에서 각 값 별로 바로 이전 행

 

lead(속성) over (order by (정렬기준)) 해당 속성에서 각 값 별로 바로 이후 행

 

select month, amount, 
lag(amount) over (order by month) as before_month,
lead(amount) over (order by month) as after_month
from bill;

 

 

 

 

1월 1일의 경우 이전 행은 없으니 null이 들어오고 이후 행의 amount는 52000이니 52000이 들어오는 모습

 

바로 이전이 아니고 n번째 이전 행이나 n번째 이후 행을 가져오고 싶다면?

 

lag(속성,n)

 

lead(속성,n)으로 2번째 파라미터에 값을 설정

 

select month, amount, 
lag(amount,2) over (order by month) as before_month,
lead(amount,2) over (order by month) as after_month
from bill;

 

 

 

2월 1일의 경우 2번째 이전 행은 없으니 null이고 2번째 이후 행은 4월 1일의 50500이니 50500이 들어오는 모습

 

null값에 null을 넣지 말고 0으로 대체해서 넣고 싶다면?

 

lag(속성, n, 0)으로 3번째 파라미터에 null값 대체값을 넣는다

 

select month, amount, 
lag(amount,2,0) over (order by month) as before_month,
lead(amount,2) over (order by month) as after_month
from bill;

 

 

 

 

이전 행 lag의 경우 null 대신 0을 넣으라 했고 이후 행 lead의 경우에는 지정하지 않았더니

 

실제로 이전 행 lag의 경우 null 대신 0이 들어감

 

TAGS.

Comments