SQL
연속하는 값을 찾으려면 어떻게 해야 할까? : WINDOW함수
동그리 02
2022. 10. 9. 20:31
leetcode 180 . Consecutive Numbers 문제를 풀면서 정말 머리를 싸매고 풀었다. 머릿속으로는 이렇게 풀면 되는거 아닌가? 하면서 코드를 짜려고 하면....이상과 현실의 갭이 굉장히 크다는 걸 코테를 풀면서 여러 번 느낀다^^;;
연속적으로 나열된 값을 찾기 위해서 WINDOW함수와 WINDOW함수 FUNCTION 중 LEAD함수를 사용해봤다. (WINDOW함수...겁먹지마...)
그렇다면 WINDOW함수란 무엇일까 ?
WINDOW함수
- 행과 행간의 관계를 쉽게 정의하기 위해 만든 함수
- 순위 , 합계, 평균 , 행 위치 등을 조작할 수 있다.
WINDOW함수 FUNCTION
| 구분 | 함수 |
| 순위 | RANK, DENSE_RANK ,ROW_NUMBER |
| 집계 | SUM, MAX, MIN, AVG, COUNT |
| 행 위치 | FIRST_VALUE, LAST_VALUE, LAG(미루고), LEAD(당기고) |
| 비율 | RATIO_TO_REPORT, PERCENT_RANK, CUME_DIST, NTILE |
table
| id | num |
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
output
| ConsecutiveNums |
| 1 |
한 테이블에 내가 원하는 정보만 담고 싶었다.
| num(현재행) | next(다음행) | afternext(그 다음행) |
| 1 | 1 | 1 |
| 1 | 1 | 2 |
| 1 | 2 | 1 |
| 2 | 1 | 2 |
| 1 | 2 | 2 |
| 2 | 2 | null |
| 2 | null | null |
SELECT num ,
LEAD(num , 1)over(partition by id) as next ,
LEAD(num , 2)over(partition by id) as afternext
FROM Logs
<결과>
| num(현재행) | next(다음행) | afternext(그 다음행) |
| 1 | null | null |
| 1 | null | null |
| 1 | null | null |
| 2 | null | null |
| 1 | null | null |
| 2 | null | null |
| 2 | null | null |
왜 내가 원하는대로 안나올까?
partition by 는 group by 와 같은 역할을 한다. 때문에 partition by id 를 하게 되면 next , afternext 값이 존재하지 않는다. 왜냐하면 애네들은 id값들이 다른 애들이기 때문이다.
SELECT num ,
LEAD(num , 1)over(ORDER BY id) as next ,
LEAD(num , 2)over(ORDER BY id) as afternext
FROM Logs
{"headers": ["num", "next", "afternext"], "values": [[1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 2], [1, 2, 2], [2, 2, null], [2, null, null]]}
ORDER BY id 로 설정해서 해줘야 다음 id의 값들을 가져올 수 있다.