Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

집 짓는 개발블로그

[프로그래머스] 입양 시각 구하기(2) (MySQL) - WITH RECURSIVE CTE 본문

MySQL

[프로그래머스] 입양 시각 구하기(2) (MySQL) - WITH RECURSIVE CTE

취준er 2024. 7. 5. 21:44

 

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

 

프로그래머스

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

programmers.co.kr

처음에는 일련번호를 매겨서 해결하려고 했다. 

2024.06.20 - [MySQL] - MySQL 일련번호 테이블 만들기(@ROWNUM) 

 

막상 만들어봤더니 데이터가 0개인 시간대는 아예 그룹화되지 않아 문제를 해결할 수 없었다.

어쨌든 0부터 23까지의 값을 갖는 컬럼이 있는 임시 테이블이 하나 필요했다.

 

아래와 같은 쿼리를 짜면 통과할 수 있다. WITH RECURSIVE를 붙이고 CTE를 저렇게 만들면 HOUR라는 이름의 컬럼을 하나 가진 테이블이 만들어진다. 값은 0부터 23까지 들어가 있는 것을 확인할 수 있다.

 

그리고, 나는 평소에도 한 문제를 풀 때 CTE를 두 개 이상 만들어 사용할 때가 많다. 원래대로라면 순서는 상관 없다.

그런데 이 문제에서는 RECURSIVE CTE를 TIMED 다음으로 선언했더니 오류가 났다. 'WITH RECURSIVE __' 가 통째로 하나의 문법인 것으로 보인다.

 

 

+) 2024. 09. 09 설명 추가

2024.09.09 - [MySQL] - WITH RECURSIVE CTE 사용하기 (MySQL)

 

 

 

정답

WITH RECURSIVE CTE AS(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM CTE
    WHERE HOUR < 23
    ), TIMED AS(
    SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNTED
    FROM ANIMAL_OUTS
    GROUP BY HOUR(DATETIME)
) 
    
SELECT C.HOUR, (CASE WHEN T.HOUR IS NOT NULL THEN T.COUNTED ELSE 0 END) AS COUNT
FROM TIMED T RIGHT OUTER JOIN CTE C ON T.HOUR = C.HOUR
ORDER BY C.HOUR;