[프로그래머스] 입양 시각 구하기(1)

yannie·2024년 9월 9일
0

[문제]

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

[틀린 풀이]

SELECT
    HOUR(DATETIME) AS HOUR,
    COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY DATETIME
ORDER BY HOUR
;

SELECT
    HOUR(DATETIME) AS HOUR,
    COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR >= 9
GROUP BY HOUR
ORDER BY HOUR
;
  • 첫 번째 코드에서 GROUP BY절에는 DATETIME이 아닌 HOUR로 그룹화하여야 한다.
    - 왜? 시간별로 데이터를 집계하기 위해서
    • DATETIME은 '연월일 시분초'까지 포함된 전체 날짜와 시간을 의미한다. GROUP BY DATETIME을 사용하면 정확히 같은 날짜와 시간인 데이터끼리만 그룹화되어 같은 시간에 속하더라도 다른 그룹으로 분리되어 시간별 집계가 어려움
  • 두 번째 코드에서 WHERE절에는 HOUR이 아닌 HOUR(DATETIME) 전체를 작성해야 한다.
    - 왜? SQL에서 WHERE절은 SELECT절보다 먼저 실행되기 때문에 WHERE절을 실행했을 당시 HOUR(DATETIME)이 계산하기 전이기 때문에 사용할 수 없다.

[올바른 풀이]

SELECT
    HOUR(DATETIME) AS HOUR,
    COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR
ORDER BY HOUR
;
  1. HOUR()함수를 사용하여 DATETIME 데이터 타입에서 시각만 추출
  2. WHERE절을 사용하여 9시~19:59까지의 시각만 필터링

[더 나은 풀이]

WITH HOUR_TABLE AS (
    SELECT
        HOUR(DATETIME) AS HOUR,
        ANIMAL_ID
    FROM ANIMAL_OUTS
)
SELECT
    HOUR,
    COUNT(ANIMAL_ID) AS COUNT
FROM HOUR_TABLE
WHERE HOUR >= 9 AND HOUR <= 19
GROUP BY HOUR
  • 중복 호출을 피하고 가독성을 높이기 위해서는 with절을 사용하여 HOUR값을 미리 추출하는 것이 좋음

0개의 댓글