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

댓글