SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 23일차(3) 26.01.21(수)

nom_de_plume 2026. 1. 21. 10:28

부제:

입양 시각 구하기(2), 레벨 5

 

1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/59413
2. 정답 코드: 

WITH RECURSIVE date AS (
    SELECT 0 as hour
    UNION ALL
    SELECT hour+1 
    from date 
    where hour < 23
)
SELECT
    d.hour,
    count(ao.animal_id) as count
from date as d
left join animal_outs as ao
    on d.hour = hour(ao.datetime)
group by d.hour
order by d.hour


3. 오류 상황:

SELECT
    hour(datetime) as hour,
    count(animal_id) as count
from animal_outs
group by hour(datetime)
order by hour

=> 데이터가 없는 시간대 누락

 

4. 시도 방법:

=> RECURSIVE CTE 사용

=> LEFT JOIN 사용

 

5. 최종 문제 해결 방법:

=> SQL에서 존재하지 않는 연속된 숫자(0~23)를 생성하려면 RECURSIVE CTE (재귀형 공통 테이블 식)를 사용

=> 0부터 23까지 숫자를 가진 가상의 테이블을 먼저 만드는 RECURSIVE 사용

=> 가상 테이블을 왼쪽(LEFT)에 두고 원본 테이블을 LEFT JOIN 한다. 그래야 입양 기록이 없는 시간대도 숫자가 살아남고, 기록이 없는 곳은 COUNT가 0으로 출력