MySQL 프로그래머스 | 입양 시각 구하기2 (SQL식 반복문 : RECURSIVE 재귀 가상테이블 만들기)

    728x90

     

    문제

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

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    • 몇 시에 입양이 가장 활발하게 일어나는지 알아보기
    • 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성
    • 결과는 시간대 순 정렬

     

    테이블

    ANIMAL_OUTS

     

     

    풀이과정

    # 문제가 되는 지점

    • HOUR(DATETIME) 한 결과 → 7시 ~ 19시 사이의 시간만 출력됨
    • 문제에서 요구하는 결과 → 0시 ~ 23시 사이의 시간이 모두 출력되는 것
      • 즉, 데이터가 없는 0시~6시 및 20~23시도 HOUR 컬럼에 나오게 하고,
        해당 시간에 대한 입양 수는 0으로 출력되게 만들어야 하는 것!

     

    # 재귀쿼리 만들기 (RECURSIVE)

    1
    2
    3
    4
    5
    6
    WITH RECURSIVE H AS(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1
    FROM H
    WHERE HOUR < 23)
    cs

     

     

    # ANIMAL_OUTS 테이블과 LEFT JOIN

    • 재귀 테이블 H에 ANIMAL_OUTS 테이블을 LEFT JOIN
    • 재귀 테이블에서 만든 HOUR로 그룹화 해준 뒤 COUNT(A.ANIMAL_ID) 해주기
    • 여기에 정렬 조건만 주면 끝!

     

    # 정답

    1
    2
    3
    4
    5
    SELECT H.HOUR, COUNT(A.ANIMAL_ID) AS COUNT  -- COUNT(A.DATETIME)도 됨
    FROM H
    LEFT JOIN ANIMAL_OUTS A ON HOUR(A.DATETIME= H.HOUR
    GROUP BY H.HOUR
    ORDER BY H.HOUR
    cs
    728x90

    댓글