[SQL] Recursive 표현으로 쿼리 만들기

JIEUN KANG·2020년 12월 24일
4

프로그래머스의 입양 시각 구하기(2) 문제를 보게 되면서 고민에 빠지게 된다.

0부터 24시까지의 hour 칼럼을 어떻게 만들지?

계속 검색을 해본 결과, python처럼 for문을 써서 0부터 24까지 만드는 구문은
recursive 쿼리가 가장 비슷한 개념인것 처럼 보인다!


출처: https://www.mysqltutorial.org/mysql-recursive-cte/

대략 읽어보니 초기 설정값과 recursive할 쿼리를 union all로 엮는 쿼리같다.
with로 임시 테이블을 생성하고,

1
2
3
4
5
6
WITH recursive CTE as( #재귀쿼리 세팅
    select 0 as HOUR #초기값 설정
    union all #위 쿼리와 아래 쿼리의 값을 연산
    select HOUR+1 from CTE #하나씩 불려 나감 
    where HOUR < 23 #반복을 멈추는 용도
)
cs

위 임시 테이블을 토대로 LEFT JOIN할 테이블인
ANIMAL_OUTS 테이블을 불러와주었다.
그리고 SELECT로 CTE 테이블의 HOUR와 OUTS 테이블의 HOUR를 카운트해주면 끝!

1
2
3
4
5
6
7
8
9
10
11
12
WITH recursive CTE as( #재귀쿼리 세팅
    select 0 as HOUR #초기값 설정
    union all #위 쿼리와 아래 쿼리의 값을 연산
    select HOUR+1 from CTE #하나씩 불려 나감 
    where HOUR < 23 #반복을 멈추는 용도
)
 
SELECT CTE.HOUR,COUNT(HOUR(OUTS.DATETIME)) AS COUNT
FROM CTE
LEFT JOIN ANIMAL_OUTS AS OUTS
ON CTE.HOUR = HOUR(OUTS.DATETIME)
GROUP BY CTE.HOUR #안해주면 COUNT가 전체 COUNT가 되어버린다!
cs

GROUP BY는 집계함수와 같이 따라가는 개념이니까 꼼꼼하게 챙겨야 할 것 같다.
다양한 쿼리들을 어떻게하면 잘 조합할지 생각해봐야 할 것 같다.

profile
가장 보통의 존재

1개의 댓글

comment-user-thumbnail
2021년 4월 3일

thank you

답글 달기