노아

[프로그래머스] 입양 시각 구하기(2) 본문

알고리즘/SQL

[프로그래머스] 입양 시각 구하기(2)

Noaahhh 2024. 9. 20. 22:50

 

Question

 

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

 

Pseudocode

 

 

  1. 재귀 CTE 정의:
    • WITH RECURSIVE 구문을 사용하여 time이라는 재귀 CTE를 생성합니다.
    • 처음에는 0으로 시작하고, 시간(hour)이 23이 될 때까지 1씩 증가하며 재귀적으로 시간을 생성합니다.
  2. 서브쿼리:
    • ANIMAL_OUTS 테이블에서 DATETIME 컬럼의 시간 부분을 추출하여 hour로 변환합니다.
    • 이 서브쿼리는 동물의 퇴출 시간이 포함된 결과를 제공합니다.
  3. 시간을 기준으로 조인:
    • 재귀적으로 생성된 time CTE와 ANIMAL_OUTS 데이터를 시간(hour)을 기준으로 왼쪽 조인을 합니다.
    • time CTE는 0부터 23까지의 시간을 포함하므로 모든 시간이 보장됩니다.
  4. 그룹화 및 집계:
    • hour로 그룹화하고, 각 시간대별로 animal_id의 개수를 계산합니다.
  5. 정렬:
    • 결과는 시간(hour)을 기준으로 오름차순 정렬됩니다.

 

 

 

Code

 

with recursive time
as (
    select 0 as hour
    union all
    select hour + 1
    from time
    where hour < 23
)

select t.hour, count(animal_id)
from time t left join (
    select *, hour(DATETIME) hour
    from ANIMAL_OUTS 
) o on t.hour = o.hour 
group by t.hour
order by t.hour