TIL_20231213 (SQL 문제풀이_재귀함수)

0

오늘 공부한 것 중에 가장어려웠던 문제를 풀이하며 중요한 함수를 기억해보자.
문제 : 입양 시각 구하기(2)
재귀함수란 ?

  • 다시 돌아온다는 재귀라는 말과 함수를 덧붙여 사용하는데 자기 자신을 다시 불러와서 사용한다는 의미를 갖는다.

오늘 문제에서 재귀 함수가 왜 필요했었는지 차차 알아보자!
문제는 생각보다 간단하게 생각했었으나 역시 녹록치 않았다. 입양시각을 0시부터 23시까지 줄지어서 나타내야하는데 해당 데이터에서 입양시각의 시간 중에 새벽이나 너무 늦은 시간의 경우 입양을 진행하지 않아서 데이터를 불러오면 존재하지가 않게된다.
그러므로 우리는 입양이 진행되지 않은 시간까지 입양되지 않았음을 표시해줘야한다.
그래서! 등장하는 재귀함수!
재귀함수를 사용하여 HOUR이 0시부터 23시까지 가진 임시 테이블을 만들어서 조인하는 방법으로 진행한다.

쿼리 읊어보며 확인하기

with recursive A as   #임시테이블 재귀함수 호출
(
select 0 as HOUR      # HOUR라는 이름으로 0부터 시작함을 알린다.
union all             # 본래 테이블을 중복을 무시하고 합치는 의미이나 여기선 아래 구문과 합쳐져 로테이션한다고 생각하자
select HOUR+1         # HOUR에 +1씩 추가한다.
from A                # 임시테이블을 불러와 로테이션(재귀)하겠다는 의미로 생각하였음
where HOUR < 23       # 임시 테이블A에 +1씩하여 23이 되면 재귀를 멈추겠다는 의미(*재귀함수는 이렇게 종료하는 구문을 꼭 적어주어야 한다.)
)
select A.HOUR,        # 임시 테이블 A의 HOUR컬럼과 animal_outs테이블의 시간데이터(%H)를 기준으로 카운드 한다.
	   count(HOUR(x.datetime)) as COUNT
from A left join animal_outs x # 임시테이블에 붙혀야 0시부터 나오기 때문에 임시테이블(A)를 왼쪽에 써줬다.
on HOUR(x.datetime) = A.HOUR   # 각각 테이블의 시간데이터로 매칭
group by 1            # 시간을 그룹화하기(0~23시까지 나열)
order by 1;           # 시간을 오름차순으로 나열

위 처럼 재귀함수가 돌면서 0부터 23까지 HOUR컬럼을 갖는 임시테이블을 만든다.

한줄평

  • 임시테이블을 만드는 구문을 잘 알지 못했었는데 이런 식으로 활용하는 것을 보니 무언가 해결하기 힘든 문제를 마주했을 때 한번씩 떠올려보면 좋은 쿼리문이라고 생각이 들었다. 역시 쿼리는 어떤 구조로 표현해낼 것인가를 항상 생각해야하는 것 같다.
profile
Data analyst를 향해 도전하는 이야기

0개의 댓글