이전 행을 가져오는 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이 들어감
'프로그래밍 > SQL' 카테고리의 다른 글
특정 문자 기준으로 문자열을 자르는 SUBSTRING_INDEX() (0) | 2024.10.23 |
---|---|
INSTR(), LOCATE()를 이용하여 원하는 문자의 위치를 찾기 (0) | 2024.10.22 |
SQL 코딩테스트 복기 - JSON array에 들어있는 원소의 개수(JSON_LENGTH) (0) | 2024.04.27 |
SQL 연습 - 비교연산자 = , if 조건문이 여러개일때.. case ~ when (0) | 2023.11.09 |
SQL 연습 - 통계함수 사용할때 주의할 점, limit로 지정한 수 만큼 행 추출 (0) | 2023.10.11 |