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의 값들을 가져올 수 있다.