[MySQL] 프로그래머스 문제풀이 : GROUP BY, WITH RECURSIVE (재귀)
프로그래머스 > 코딩테스트 연습 > SQL 고득점 Kit
https://programmers.co.kr/learn/challenges
https://programmers.co.kr/learn/courses/30/lessons/59413
코딩테스트 연습 - 입양 시각 구하기(2)
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물
programmers.co.kr
처음 작성한 코드.
SELECT hour(datetime) as HOUR, COUNT(*)
FROM animal_outs
GROUP BY HOUR
HAVING HOUR BETWEEN 0 AND 23
ORDER BY HOUR
각 시간대별로 입양이 몇 건이나 발생했는지를 나타내야하는데, 0건인 경우는 출력되지 않는다.
CASE문도 써봤는데 안됨..
다른 이용자들 답안을 보다가 WITH RECURSIVE 개념을 공부해봐야겠다고 생각함.
WITH RECURSIVE
WITH 구문은 메모리 상에 가상의 테이블을 저장할 때 사용된다.
WITH RECURSIVE는 가상 테이블 자신의 값을 참조하여 값을 결정할 때 사용. (재귀)
-구조-
BASE 케이스
UNION ALL
Recursive(재귀) 반복
-- 0에서 23까지의 데이터를 갖는 가상 테이블 만들기
WITH RECURSIVE TABLE1 AS (
SELECT 0 AS hour -- 초기값 AS 컬럼별명
UNION ALL
SELECT hour+1
FROM TABLE1
WHERE hour < 23 --반복 끝내는 조건
)
출력해보면 0부터 23까지를 가지는 테이블이 확인된다.
1. WITH RECURSIVE 를 이용해 가상의 테이블을 만들고
2. 그 테이블을 기준으로(left join) 문제에서 주어진 animal_outs 테이블을 outer join.
WITH RECURSIVE table1 AS (
SELECT 0 AS hour
UNION ALL
SELECT hour+1
FROM table1
WHERE hour < 23
)
SELECT HOUR, COUNT(animal_id) AS COUNT
FROM table1
LEFT OUTER JOIN animal_outs
ON HOUR(datetime) = table1.hour
group by hour
order by hour