우당탕탕 개발일지

[SQL] 프로그래머스 GROUP BY : 입양 시각 구하기(2)(level 4) 본문

SQL

[SQL] 프로그래머스 GROUP BY : 입양 시각 구하기(2)(level 4)

민아당긴아 2025. 1. 4. 19:41

💡문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

💡SQL 코드 설계

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

1. 단순히 GROUP BY HOUR(DATETIME)으로 하면 안된다. DATETIME은 모든 시간대를 다루지 않기 때문이다.실제로 결과괎을 보면 7시부터 19시까지만 HOUR(DATETIME)에 값이 있다. 0~6시, 20~23시는 아예 값이 없는 것이다.

2. 따라서 이 문제를 해결하기 위해 0, 1, ..., 23으로 구성된 열 HOUR가 필요하다. 이를 위해서는 재귀함수를 사용해서 새로운 테이블을 만들어야 한다. WITH RECURSIVE는 재귀적으로 데이터를 생성하기 위해 사용된다.

재귀함수를 사용한 새로운 테이블 B는 다음과 같다.

WITH RECURSIVE B(HOUR) AS (
	SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1
    FROM B
    WHERE HOUR < 23
)

 

💡SQL 코드

WITH RECURSIVE B(HOUR) AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 
    FROM B
    WHERE HOUR < 23
)

SELECT B.HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS A
RIGHT JOIN B
ON HOUR(DATETIME) = B.HOUR
GROUP BY 1
ORDER BY 1

 

💡기억할 내용

1. ON절에서 HOUR(DATETIME) = B.HOUR로 적어준다.