https://school.programmers.co.kr/learn/courses/30/lessons/59413
WITH RECURSIVE CTE AS(
SELECT 0 AS NUM
UNION ALL
SELECT NUM+1 FROM CTE
WHERE NUM < 23
)
SELECT NUM AS HOUR, IFNULL(COUNT, 0) AS COUNT FROM CTE
LEFT JOIN (SELECT HOUR(DATETIME) AS HOUR,
COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
) A ON A.HOUR=CTE.NUM
ORDER BY 1
실제 데이터의 시간이 7~18시?? 까지 존재했는데, 문제에서 요구하는 것은 0~23시니까 이를 해결해줘야했다. 그러기 위해선 RECURSIVE를 사용해야하는 문제였다!
파이썬의 for문 혹은 while문 처럼 사용하는 것 같다. WITH구문을 이용해서 가상 테이블을 만들고, 이를 JOIN해서 0~23의 범위를 만드는 것
어렵다!!!!! 좀 더 사용해봐야 알겠다.
처음에 WHERE에 NUM<24
했다가 틀렸다. 왜냠 위의 SELECT NUM+1 FROM CTE
를 하고나서 조건을 확인하는 것이니 NUM<23
이 맞다
WITH [RECURSIVE] TABLE명 AS (
SELECT - # 비반복문. 무조건 필수 (초기값 설정)
[UNION ALL] # RECURSIVE 사용 시 필수. 다음에 이어붙어야 할 때 사용
SELECT -
[WHERE -] # RECURSIVE 사용 시 필수. 정지 조건 필요할 때 사용
)