최대 1 분 소요

문제 링크

정답

-- ANIMAL_OUTS: ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME
WITH RECURSIVE HOURS AS(
    -- Non-recursive (초기에만 실행)
    SELECT 0 AS H
    UNION ALL
    -- recursive 
    SELECT H + 1 AS H
    FROM HOURS
    WHERE H < 23
)

SELECT T2.H AS HOUR, COUNT(T1.ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS AS T1
RIGHT JOIN HOURS AS T2 ON HOUR(T1.DATETIME) = T2.H
GROUP BY T2.H
ORDER BY T2.H
;

✅ Point

  • 누락된 시간 채우기
    • want:
      1. 0 ~ 23 범위의 시간별 집계
      2. 데이터가 없는 시간도 모두 표시
    • 해결 방법
      1. 0 ~ 23 범위의 테이블 만들기
        • WITH RECURSIVE를 사용하여 0 ~ 23을 생성하는 시간 table 작성
      2. 기존 데이터와 join
        • 누락된 시간대도 포함되어야 하므로 시간 table을 기준으로 join
      3. 누락된 시간의 count 처리
        • NULL 인 row는 세지 않는다
          • 방법1: count(기존 table의 주요 column)
          • 방법2: sum(case when ... then 1 else 0)