노트1/SQL

[MySQL] 프로그래머스 문제풀이 : GROUP BY, WITH RECURSIVE (재귀)

Paige09 2022. 2. 10. 14:41

프로그래머스 > 코딩테스트 연습 > 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

......