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.. 문법을 배워야 한다..