SQL
[SQL] Programmers 59413번 입양 시각 구하기(2) - WITH RECURSIVE, HOUR, COUNT
Rubi ❤️
2025. 5. 4. 00:39
728x90
반응형
📌 문제 소개
문제 바로가기 - [Programmers 59413번]
ANIMAL_OUTS 테이블에서 입양 시간(DATETIME)을 기준으로 0시부터 23시까지
각 시간대별 입양 건수를 집계하기
요구사항 요약:
- 0시부터 23시까지, 시간대별 입양 건수 조회
- 입양이 없는 시간대도 0건으로 출력
- 시간(HOUR) 오름차순으로 정렬
🧾 테이블 구조
🔹 ANIMAL_OUTS 테이블
컬럼명 | 타입 | 설명 |
ANIMAL_ID | VARCHAR | 동물 ID |
ANIMAL_TYPE | VARCHAR | 동물 종류 |
DATETIME | DATETIME | 입양일 (날짜 + 시간 포함) |
NAME | VARCHAR | 이름 |
SEX_UPON_OUTCOME | VARCHAR | 입양 당시 성별 및 중성화 여부 |
🔍 풀이 전략
- 0~23시까지 시간대를 먼저 생성해야 함
→ 모든 시간대가 빠짐없이 나타나도록 하기 위해 - 생성한 시간대와 ANIMAL_OUTS 테이블을 LEFT JOIN
→ 입양이 없는 시간대도 COUNT = 0으로 출력되게 하기 위함 - DATETIME에서 HOUR을 추출해 시간대별로 그룹핑
🛠️ 사용한 SQL 문법
문법 | 설명 |
WITH RECURSIVE | 0~23까지 시간 목록 생성 (MySQL 기준) |
HOUR(DATETIME) | DATETIME에서 시간(HOUR)만 추출 |
LEFT JOIN | 모든 시간대 표시 (입양 없는 시간도 포함) |
GROUP BY | 시간대별 집계 |
ORDER BY | 시간 오름차순 정렬 |
✅ MySQL 풀이
-- 0~23시간대 생성 (MySQL에서는 RECURSIVE CTE 사용)
WITH RECURSIVE hours AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1 FROM hours WHERE HOUR < 23
)
-- 각 시간대별 입양 수 카운트
SELECT
h.HOUR,
COUNT(a.ANIMAL_ID) AS COUNT
FROM hours h
LEFT JOIN ANIMAL_OUTS a
ON HOUR(a.DATETIME) = h.HOUR
GROUP BY h.HOUR
ORDER BY h.HOUR;
🧪 결과 예시
HOUR COUNT
HOUR | COUNT |
0 | 0 |
1 | 0 |
2 | 0 |
... | ... |
11 | 13 |
13 | 14 |
18 | 16 |
23 | 0 |
💡 핵심 정리
- RECURSIVE CTE를 이용해 0~23까지 시간대 생성
- LEFT JOIN을 활용해 입양이 없는 시간대도 0건으로 표시
- HOUR() 함수로 DATETIME에서 시간(HOUR)만 추출
- 시간대 누락 없이 전체 시계열 분석 가능
🔄 응용
- 분 단위(MINUTE()), 요일별(WEEKDAY()), 날짜별(DATE()) 통계도 가능
- 시간대별 비율 분석, 히트맵 시각화용 데이터로 활용 가능
✅ 마무리
- 시계열 데이터 분석방법을 배울 수 있었다.
- 누락된 시간대 추가를 위한 재귀 CTE 및 GROUP BY + JOIN 활용을 배울 수 있었음!
728x90
반응형