프로그래머스 SQL 고득점 킷 입양 시각 구하기(2)

hysss·2023년 2월 24일
0

GROUP BY - 입양 시각 구하기(2)

문제 분석

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

코드

WITH RECURSIVE HOURS AS(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1
    FROM HOURS
    WHERE HOUR < 23
)

(
    SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
    FROM ANIMAL_OUTS
    GROUP BY HOUR(DATETIME)
)
UNION ALL
(
    SELECT HOUR, 0 AS COUNT
    FROM HOURS
    WHERE HOUR NOT IN (SELECT HOUR(DATETIME)
                       FROM ANIMAL_OUTS
                       GROUP BY HOUR(DATETIME))
)
ORDER BY HOUR

문제 풀이

문제 자체는 간단했지만, 원래의 테이블인 ANIMAL_OUTS의 DATETIME Column에는 7시 ~ 19시 까지의 기록 밖에 없다는 것이 문제였다.

그래서 WITH RECURSIVE 구문을 사용하여 재귀적으로 가상 테이블을 만들어보았다.

먼저 WITH RECURSIVE 구문은 아래와 같은 구성으로 이루어져 있다.

WITH RECURSIVE TABLE명 AS (
    SELECT ...  # 기본 질의어 (Base query)
    UNION [ALL] # 다음에 나오는 내용들을 Base query에 이어 붙인다.
    SELECT ...
    FROM TABLE명
    WHERE ...   # UNION을 반복하다가, 이 조건문을 만족하거나 더이상 변화가 없으면 끝
)

나는 0부터 23까지를 원소로 갖는 HOUR Column을 만들었다. 이 쿼리가 수행되는 과정은 다음과 같다.

WITH RECURSIVE HOURS AS(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1
    FROM HOURS
    WHERE HOUR < 23
)
  1. Base query원소가 0 하나인 HOUR Column을 가진 테이블 HOURS를 만든다.
  2. HOURS 테이블에서 HOUR Column을 가져와서 + 1을 한다.
  3. HOURS 테이블에 2번 결과를 UNION 한다.
  4. 2, 3번을 HOUR가 23이 될 때 까지 반복한다. 23이 되면 WHERE절을 만족하지 못하므로 끝난다. (참고: 24시는 0시라서 23이 끝 맞음)
profile
매일 매일 규칙적으로

0개의 댓글