Algorithm/Programmers SQL

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

제우제우 2024. 9. 19. 16:25

https://school.programmers.co.kr/learn/courses/30/lessons/59413

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코딩테스트 연습 > GROUP BY > 입양 시각 구하기(2)

 

문제 분석

난이도: LEVEL4

 

문제 요구사항

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

 

정답 코드

WITH RECURSIVE TIME AS (
    SELECT 0 HOUR
    
    UNION ALL
    
    SELECT (HOUR + 1) HOUR
    FROM TIME 
    WHERE TIME.HOUR != 23
)
SELECT T.HOUR, 
CASE
   WHEN A.COUNT IS NULL THEN 0
   ELSE A.COUNT
END COUNT 
FROM TIME T LEFT JOIN (SELECT CASE
                                   WHEN DATE_FORMAT(DATETIME, '%H') = 24 THEN 0 
                                   ELSE DATE_FORMAT(DATETIME, '%H') 
                               END HOUR, COUNT(*) COUNT
                       FROM ANIMAL_OUTS
                       GROUP BY 1) A
ON T.HOUR = A.HOUR

 

DATE_FORMAT Expression에서 %H: 24시간 형식 %h: 12시간 형식을 표현한다. 

0 ~ 23시 까지 TIME CTE에 존재해서 시간이 24시면 0시로 변환한다. (CASE WHEN THEN 사용) 

 

동일한 코드 

WITH RECURSIVE TIME AS ( -- recursive cte 활용 0 ~ 23 
    SELECT 0 HOUR 
    
    UNION ALL
    
    SELECT HOUR + 1
    FROM TIME 
    WHERE HOUR != 23
),
ANIMAL_OUTS_TIME AS (
   SELECT CASE 
                WHEN DATE_FORMAT(DATETIME, '%H') != 24 THEN DATE_FORMAT(DATETIME, '%H')
                ELSE 0
          END HOUR,
          COUNT(*) COUNT   
   FROM ANIMAL_OUTS
   GROUP BY 1 
)
SELECT T.HOUR, CASE
                    WHEN A.COUNT IS NULL THEN 0
                    ELSE A.COUNT 
               END COUNT 
FROM TIME T LEFT JOIN ANIMAL_OUTS_TIME A 
ON T.HOUR = A.HOUR 
ORDER BY 1