24-04-09 SQL LAG, LEAD
오늘은 SQL 공부를 하다가 LAG와 LEAD라는 윈도우 함수를 알게되었다. 그 내용을 정리해보았다.
1. LAG
LAG와 LEAD는 모두 특정 위치의 행을 출력하는 윈도우 함수이다. LAG는 이전 행의 값을 가져오고 LEAD는 다음 행의 값을 가져온다는 차이가 있다.
LAG의 사용법은 다른 윈도우 함수들과 똑같다.
LAG(칼럼명) OVER (PARTITION BY ... ORDER BY ... )
LAG를 그냥 사용하게 되면 이전 행의 값을 가져온다. 예시로 살펴보자.
예시 테이블 <숫자한글>
숫자 | 한글 |
1 | 가 |
7 | 사 |
3 | 다 |
6 | 바 |
5 | 마 |
4 | 라 |
2 | 나 |
SELECT 숫자, 한글, LAG(한글) OVER () AS LAG
FROM 숫자한글
결과 테이블
숫자 | 한글 | LAG |
1 | 가 | [null] |
7 | 사 | 가 |
3 | 다 | 사 |
6 | 바 | 다 |
5 | 마 | 바 |
4 | 라 | 마 |
2 | 나 | 라 |
첫 행은 이전 행이 없으므로 null이 들어가게 된다.
이번에는 똑같은 예시 테이블<숫자한글>을 숫자를 기준으로 정렬한 뒤에 LAG 함수를 사용해보자.
SELECT 숫자, 한글, LAG(한글) OVER (ORDER BY 숫자) AS LAG
FROM 숫자한글
결과 테이블
숫자 | 한글 | LAG |
1 | 가 | [null] |
2 | 나 | 가 |
3 | 다 | 나 |
4 | 라 | 다 |
5 | 마 | 라 |
6 | 바 | 마 |
7 | 사 | 바 |
모두 제대로 정렬되어 출력된 것을 볼 수 있다.
LAG를 사용할때 인자로 숫자를 추가해주면 바로 이전 행이 아니라 그 숫자 만큼의 이전 행을 가져올 수 있다.
아래와 같이 3을 넣은 뒤 결과를 살펴보자.
SELECT 숫자, 한글, LAG(한글, 3) OVER (ORDER BY 숫자) AS LAG
FROM 숫자한글
결과 테이블
숫자 | 한글 | LAG |
1 | 가 | [null] |
2 | 나 | [null] |
3 | 다 | [null] |
4 | 라 | 가 |
5 | 마 | 나 |
6 | 바 | 다 |
7 | 사 | 라 |
위와 같이 3행 이전의 값을 가져오는 것을 볼 수 있다.
LAG를 사용할 때 숫자로 몇 행 이전을 지정해 준 다음에, 다시 인자를 하나 더 추가해줄 수 있다. 이전 행이 존재하지 않는 경우에 null이 들어가게 되는데 이 부분에 null 대신에 지정해준 값을 넣을 수 있다.
SELECT 숫자, 한글, LAG(한글, 3, '3번째 이전 행이 존재하지 않음') OVER (ORDER BY 숫자) AS LAG
FROM 숫자한글
결과 테이블
숫자 | 한글 | LAG |
1 | 가 | 3번째 이전 행이 존재하지 않음 |
2 | 나 | 3번째 이전 행이 존재하지 않음 |
3 | 다 | 3번째 이전 행이 존재하지 않음 |
4 | 라 | 가 |
5 | 마 | 나 |
6 | 바 | 다 |
7 | 사 | 라 |
다음과 같이 null 대신 특정 값을 넣어줄 수 있다.
2. LEAD
이제는 LEAD를 알아보자. LEAD는 LAG와 방향만 다를 뿐 완전히 똑같다. LEAD는 지정해준 숫자 만큼 다음 행의 값을 가져온다
LEAD를 그냥 사용하면 바로 다음 행의 값을 가져온다.
SELECT 숫자, 한글, LEAD(한글) OVER (ORDER BY 숫자) AS LEAD
FROM 숫자한글
결과 테이블
숫자 | 한글 | LEAD |
1 | 가 | 나 |
2 | 나 | 다 |
3 | 다 | 라 |
4 | 라 | 마 |
5 | 마 | 바 |
6 | 바 | 사 |
7 | 사 | [null] |
바로 다음 행이 존재하지 않는 경우 null이 들어가게 된다.
나머지도 LAG와 완전히 동일하다. 이번에는 3번째 다음 행의 값을 가져오고, 3번째 다음 행이 존재하지 않는 경우 null을 대신할 문자열을 넣어보자.
SELECT 숫자, 한글, LEAD(한글, 3, '3번째 다음 행이 존재하지 않음') OVER (ORDER BY 숫자) AS LEAD
FROM 숫자한글
결과 테이블
숫자 | 한글 | LEAD |
1 | 가 | 라 |
2 | 나 | 마 |
3 | 다 | 바 |
4 | 라 | 사 |
5 | 마 | 3번째 다음 행이 존재하지 않음 |
6 | 바 | 3번째 다음 행이 존재하지 않음 |
7 | 사 | 3번째 다음 행이 존재하지 않음 |
정상적으로 결과가 나오는 것을 볼 수 있다.
3. 오늘 배운 것
- SQL에서 LAG, LEAD라는 윈도우 함수를 알게되었다.
- 이론에 대해서도 추가적으로 공부를 해보았는데 엔터티, 속성, 식별자에 관한 내용도 알게 되었다.