집 짓는 개발블로그
[프로그래머스] 입양 시각 구하기(2) (MySQL) - WITH RECURSIVE CTE 본문
https://school.programmers.co.kr/learn/courses/30/lessons/59413
처음에는 일련번호를 매겨서 해결하려고 했다.
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;
'MySQL' 카테고리의 다른 글
WITH RECURSIVE CTE 사용하기 (MySQL) (0) | 2024.09.09 |
---|---|
[프로그래머스] 재구매가 일어난 상품과 회원 리스트 구하기 (MySQL) - 2개 이상의 분류로 GROUP BY하기 (0) | 2024.08.13 |
[프로그래머스] 특정 세대의 대장균 찾기 (MySQL) (0) | 2024.07.05 |
[프로그래머스] 이름에 el이 들어가는 동물 찾기 (MySQL) - LIKE, INSTR, LOCATE (0) | 2024.07.05 |
[프로그래머스] 특정 물고기를 잡은 총 수 구하기 (MySQL) (0) | 2024.06.27 |