[programmers] SQL Lv. 4 - 입양 시각 구하기(2)

2025. 2. 6. 00:16·Algorithm Solving/SQL

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

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

예시
SQL문을 실행하면 다음과 같이 나와야 합니다.

 


풀이

초기 접근 방식

SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR, COUNT(*) FROM ANIMAL_OUTS AS COUNT
GROUP BY DATE_FORMAT(DATETIME, '%H')
ORDER BY CAST(HOUR AS UNSIGNED)

위 쿼리는 입양된 동물이 있는 시간대만 출력하기 때문에 문제의 조건과 다른 결과가 출력된다.

  • 모든 시간대가 포함되지 않음
    • 이 쿼리는 ANIMAL_OUTS 테이블에서 실제 입양 기록이 있는 시간대만 반환
    • 입양된 동물이 없는 시간대가 결과에서 누락되지 않도록 개선해야한다.
  • `GROUP BY`를 사용하여 시간대별 그룹화
    • 데이터가 없는 시간은 처리가 불가능함
    • 0~23시 범위의 시간대를 강제로 포함하도록 개선해야한다.

 

개선된 풀이

0~23까지 모든 시간대를 테이블로 생성

-- 0 ~ 23시까지 시간대 테이블 생성
WITH RECURSIVE HOUR_TABLE AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM HOUR_TABLE WHERE HOUR < 23
)
  • 입양 기록이 없는 시간대도 JOIN을 통해 출력이 가능하도록 시간대 테이블을 생성

 

LEFT JOIN을 통해 조건에 맞게 조회

SELECT 
    H.HOUR,
    COUNT(A.DATETIME) AS COUNT
FROM HOUR_TABLE H
LEFT JOIN ANIMAL_OUTS A
    ON H.HOUR = HOUR(DATETIME)
GROUP BY H.HOUR
ORDER BY H.HOUR
  • 생성한 시간 테이블(HOUR_TABLE)을 ANIMAL_OUTS 테이블과 `LEFT JOIN`하여 입양 기록이 없는 시간도 조회 가능하게 만듦
  • `LEFT JOIN`을 사용하면 ANIMAL_OUTS에 데이터가 없는 경우에도 시간대가 유지되므로, COUNT가 0인 시간대도 출력이 가능

 


제출

-- 0 ~ 23시까지 시간대 테이블 생성
WITH RECURSIVE HOUR_TABLE AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM HOUR_TABLE WHERE HOUR < 23
)
-- 조회
SELECT 
    H.HOUR,
    COUNT(A.DATETIME) AS COUNT
FROM HOUR_TABLE H
LEFT JOIN ANIMAL_OUTS A
    ON H.HOUR = HOUR(DATETIME)
GROUP BY H.HOUR
ORDER BY H.HOUR
저작자표시 비영리 변경금지 (새창열림)

'Algorithm Solving > SQL' 카테고리의 다른 글

[programmers] SQL Lv. 4 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기  (0) 2025.02.19
[programmers] SQL Lv. 4 - 그룹별 조건에 맞는 식당 목록 출력하기  (2) 2025.01.15
[programmers] SQL Lv. 3 - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기  (0) 2025.01.14
[programmers] SQL Lv. 4 - 저자 별 카테고리 별 매출액 집계하기  (0) 2025.01.13
[programmers] SQL Lv. 4 - 주문량이 많은 아이스크림들 조회하기  (0) 2025.01.10
'Algorithm Solving/SQL' 카테고리의 다른 글
  • [programmers] SQL Lv. 4 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
  • [programmers] SQL Lv. 4 - 그룹별 조건에 맞는 식당 목록 출력하기
  • [programmers] SQL Lv. 3 - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
  • [programmers] SQL Lv. 4 - 저자 별 카테고리 별 매출액 집계하기
기만나🐸
기만나🐸
공부한 내용을 기록합시다 🔥🔥🔥
  • 기만나🐸
    기만나의 공부 기록 🤓
    기만나🐸
  • 전체
    오늘
    어제
    • ALL (147)
      • TIL (Today I Learned) (56)
      • Dev Projects (15)
      • Algorithm Solving (67)
        • Java (52)
        • SQL (15)
      • Certifications (8)
        • 정보처리기사 실기 (8)
  • 인기 글

  • 태그

    join
    javascript
    Google Fonts
    java
    BOJ
    programmers
    자료구조
    jpa
    완전탐색
    mysql
    websocket
    CSS
    HTML
    jQuery
    시뮬레이션
    greedy
    백준
    Firebase
    그리디
    jwt
    백트래킹
    DFS
    sql
    BFS
    bootstrap
    GROUP BY
    다이나믹프로그래밍
    dp
    Subquery
    프로그래머스
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기만나🐸
[programmers] SQL Lv. 4 - 입양 시각 구하기(2)
상단으로

티스토리툴바