728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
-- 코드를 입력하세요
WITH RECURSIVE TMP AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR+1
FROM TMP
WHERE HOUR<23
)
SELECT ROUND(HOUR) AS HOUR, COUNT(A.ANIMAL_ID) AS COUNT
FROM (SELECT ROUND(HOUR(DATETIME)%24) AS HOUR, ANIMAL_ID FROM ANIMAL_OUTS
UNION ALL
SELECT HOUR, NULL AS ANIMAL_ID FROM TMP) AS A
GROUP BY HOUR
ORDER BY HOUR;
MYSQL에서도 재귀를 쓸 수 있다는 사실을 처음 알았다.
WITH RECURSIVE TMP AS (
SELECT 0 AS HOUR -- 재귀 초깃값
UNION ALL
SELECT HOUR+1 -- 재귀
FROM TMP
WHERE HOUR<23 -- 재귀 정지 조건
)
-- 0부터 23까지의 데이터를 갖는 가상 테이블 생성
-- HOUR라는 컬럼의 0~23까지의 테이블이 생성된다.
WITH RECURSIVE
1) 임시 테이블을 불러올 때 사용하던 WITH와 함께 사용한다.
2) 테이블 합쳐주는 UNION ALL을 사용
재귀를 사용하지 않은 초기의 테이블
UNION ALL
재귀 테이블
SELECT ROUND(HOUR) AS HOUR, COUNT(A.ANIMAL_ID) AS COUNT
FROM (SELECT ROUND(HOUR(DATETIME)%24) AS HOUR, ANIMAL_ID FROM ANIMAL_OUTS
UNION ALL
SELECT HOUR, NULL AS ANIMAL_ID FROM TMP) AS A
GROUP BY HOUR
ORDER BY HOUR;
둘을 합칠 때에도 이미 0이 아닌 시간들을 뽑아낸 테이블과 UNION ALL 하는 것이 아니라,
미리 TMP와 ANIMAL_OUTS 테이블을 UNION한 뒤, 거기서 GROUP BY를 사용해서 묶어줬다.
코테에도 나왔으니 .. 다시 한번 풀어볼 것 !
728x90
'코테 > SQL' 카테고리의 다른 글
| [Programmers] PCSQL 샘플문제 4번 (MYSQL) (0) | 2024.02.02 |
|---|---|
| [Solvesql] 실전반 무료 문제 풀이 (SQLite) (1) | 2024.02.02 |
| [Solvesql] 입문반 무료 문제 풀이 (SQLite) (1) | 2024.01.28 |
| [Programmers] 상품을 구매한 회원 비율 구하기 (JOIN) (1) | 2024.01.26 |
| [Programmers] IFNULL, 조건에 맞는 값 구하기 (0) | 2023.05.02 |