SQL/MySQL
[윈도우 함수] Lead, Lag 함수
지연v'_'v
2023. 11. 26. 15:03
이전에 발행한 윈도우 함수 관련 글 ↓
[윈도우 함수] SUM() OVER()
아래 문제를 통해 OVER() 함수에 대해 알아보자. 2023년 4월 기준 전국 주요 시/도의 연령대별 인구수 합계를 구하고, 연령대별 인구 비율 구하기 ✅step1 :2023년 4월 기준 전국 주요 시/도의 연령대별
fine-1004.tistory.com
[윈도우 함수] RANK() OVER()
쿼리문 작성 시 '순위'를 매겨야 할 때가 있다. 예를 들면, A라는 class 내에서 수학성적 1등이 누구인지? 혹은 내가 운영하는 책방에서 판매량이 1위인 책이 무엇인지? 등을 알아보고 싶을 때. 이
fine-1004.tistory.com
Leet Code를 풀고 있는데, 이전 row와 다음 row를 참조해야 하는 문제가 있었다...!이 때는 LEAD, LAG함수를 사용하면 된다.
Lead, Lag 역시 row_number나 rank와 같이 Window function이다.
- LEAD(): 현재 행 다음의 행에 있는 열 값을 가져옴
- LAG(): 현재 행 이전의 행에 있는 열 값을 가져옴
Stadium이라는 테이블이 아래와 같다고 가정하자.
"+------+------------+-----------+
| id | visit_date | people |
+------+------------+-----------+
| 1 | 2017-01-01 | 10 |
| 2 | 2017-01-02 | 109 |
| 3 | 2017-01-03 | 150 |
| 4 | 2017-01-04 | 99 |
| 5 | 2017-01-05 | 145 |
| 6 | 2017-01-06 | 1455 |
| 7 | 2017-01-07 | 199 |
| 8 | 2017-01-09 | 188 |
+------+------------+-----------+
만약 Stadium 테이블에서 LEAD, LAG를 적용하면 어떤 결과가 나올까?
SELECT
id,
visit_date,
people,
LAG(people, 1) OVER (ORDER BY id) AS lag1_people,
LAG(people, 2) OVER (ORDER BY id) AS lag2_people,
LEAD(people, 1) OVER (ORDER BY id) AS lead1_people,
LEAD(people, 2) OVER (ORDER BY id) AS lead2_people
FROM Stadium;
다음과 같은 결과가 나오게 된다.
+----+------------+--------+-------------+-------------+--------------+--------------+
| id | visit_date | people | lag1_people | lag2_people | lead1_people | lead2_people |
+----+------------+--------+-------------+-------------+--------------+--------------+
| 1 | 2017-01-01 | 10 | NULL | NULL | 109 | 150 |
| 2 | 2017-01-02 | 109 | 10 | NULL | 150 | 99 |
| 3 | 2017-01-03 | 150 | 109 | 10 | 99 | 145 |
| 4 | 2017-01-04 | 99 | 150 | 109 | 145 | 1455 |
| 5 | 2017-01-05 | 145 | 99 | 150 | 1455 | 199 |
| 6 | 2017-01-06 | 1455 | 145 | 99 | 199 | 188 |
| 7 | 2017-01-07 | 199 | 1455 | 145 | 188 | NULL |
| 8 | 2017-01-09 | 188 | 199 | 1455 | NULL | NULL |
+----+------------+--------+-------------+-------------+--------------+--------------+