Coding Test/SQL
입양 시각 구하기(2) (SQL 문제 풀이)
_data
2025. 4. 17. 21:18
https://school.programmers.co.kr/learn/courses/30/lessons/59413
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물들의 정보를 담고 있다.
보호소에서는 입양이 어느 시간대에 가장 활발하게 일어나는지 알고 싶어 한다.
그래서 0시부터 23시까지 각 시간대별 입양 건수를 구해야 하며,
입양이 한 건도 없는 시간도 반드시 포함되어야 한다.
또한 결과는 시간(HOUR) 순으로 정렬되어야 한다.
🗂️ 테이블 구조
컬럼명타입설명
ANIMAL_ID | VARCHAR(N) | 동물 ID |
ANIMAL_TYPE | VARCHAR(N) | 동물 종류 |
DATETIME | DATETIME | 입양 날짜 및 시간 |
NAME | VARCHAR(N) | 동물 이름 (nullable) |
SEX_UPON_OUTCOME | VARCHAR(N) | 성별 및 중성화 여부 |
✅ 쿼리 풀이 요약
- 0~23까지의 시간대(HOUR)를 생성
- 입양 기록에서 DATETIME을 기준으로 HOUR만 추출하여 COUNT
- 두 결과를 LEFT JOIN으로 연결
- 입양이 없는 시간대는 0으로 표시
💻 최종 SQL
WITH RECURSIVE hours AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1
FROM hours
WHERE HOUR < 23
),
hourly_adoptions AS (
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
)
SELECT h.HOUR, IFNULL(a.COUNT, 0) AS COUNT
FROM hours h
LEFT JOIN hourly_adoptions a ON h.HOUR = a.HOUR
ORDER BY h.HOUR;
🧾 출력 예시
HOURCOUNT
0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
... | ... |
11 | 13 |
12 | 10 |
13 | 14 |
18 | 16 |
23 | 0 |
✍️ 개념 정리
- WITH RECURSIVE는 숫자나 날짜 등 연속적인 값을 만들 때 유용하다. -> 잘 모르겠다면 연습해보자.
- HOUR(DATETIME)은 시간만 뽑는 함수.
- LEFT JOIN을 사용하면 기준 테이블에는 있지만 상대 테이블에 없는 값도 보존된다.
- IFNULL(값, 0)으로 NULL을 0으로 치환해 입양이 없는 시간도 표시 가능하다.
📌 핵심 문장
없는 값도 보여줘야 한다면, LEFT JOIN + IFNULL 조합을 기억하자!
WITH RECURSIVE.. 문법을 배워야 한다..