mysql 문제를 풀면서 가장 오랫동안 고민을 했던 문제다.
with recursive를 통해 가상테이블을 만든 후 join을 통해 문제를 해결할 수 있었다.
처음에는 입양시간 별 횟수를 구하는 쿼리는 작성했다.
SELECT HOUR(DATETIME) as HOUR, count(*) as COUNT
from ANIMAL_OUTS
group by HOUR
order by HOUR
결과는 다음과 같다.
위 결과를 보면 0~6시와 20~23시에는 입양을 하지 않아 데이터가 존재하지 않는다. 그래서 해당 시간의 데이터를 만들어서 출력을 해야했다. 다양한 시도를 하는 과정에서 with recursive라는 것을 알게 되었다.
📌 WITH RECURSIVE
WITH RECURSIVE 구문은 가상 테이블을 생성하면서 가상 테이블 자신의 값을 참조하여 값을 결정할 때 사용된다.
해당 구문을 사용하여 데이터가 존재하지 않는 부분을 채워넣은 가상테이블을 하나 만들었다.
with recursive time as (
select 0 as HOUR // 초기값 설정
union
select HOUR + 1
from time
where HOUR < 23 // recursive 탈출 조건
) // 0~23시까지의 가상테이블(time) 생성
SELECT b.HOUR, count(a.DATETIME) as COUNT
from ANIMAL_OUTS a
right join time b
on HOUR(a.DATETIME) = b.HOUR
group by b.HOUR
order by b.HOUR