보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.
WITH RECURSIVE HOURS AS(
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1
FROM HOURS
WHERE HOUR < 23
)
(
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
)
UNION ALL
(
SELECT HOUR, 0 AS COUNT
FROM HOURS
WHERE HOUR NOT IN (SELECT HOUR(DATETIME)
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME))
)
ORDER BY HOUR
문제 자체는 간단했지만, 원래의 테이블인 ANIMAL_OUTS의 DATETIME Column에는 7시 ~ 19시 까지의 기록 밖에 없다는 것이 문제였다.
그래서 WITH RECURSIVE 구문을 사용하여 재귀적으로 가상 테이블을 만들어보았다.
먼저 WITH RECURSIVE 구문은 아래와 같은 구성으로 이루어져 있다.
WITH RECURSIVE TABLE명 AS (
SELECT ... # 기본 질의어 (Base query)
UNION [ALL] # 다음에 나오는 내용들을 Base query에 이어 붙인다.
SELECT ...
FROM TABLE명
WHERE ... # UNION을 반복하다가, 이 조건문을 만족하거나 더이상 변화가 없으면 끝
)
나는 0부터 23까지를 원소로 갖는 HOUR Column을 만들었다. 이 쿼리가 수행되는 과정은 다음과 같다.
WITH RECURSIVE HOURS AS(
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1
FROM HOURS
WHERE HOUR < 23
)