문제
MYSQL
WITH RECURSIVE HOURS AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1
FROM HOURS
WHERE HOUR < 23
),
ANIMAL AS (SELECT HOUR(DATETIME) HOUR, ANIMAL_ID
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 0 AND HOUR(DATETIME) <= 23
)
SELECT B.HOUR, COUNT(A.ANIMAL_ID) COUNT
FROM ANIMAL A
RIGHT JOIN HOURS B ON A.HOUR = B.HOUR
GROUP BY B.HOUR
ORDER BY HOUR
RECURSIVE 재귀쿼리는 ORACLE에서는 지원되지 않는다.
WITH RECURSIVE hours AS (
SELECT 0 AS hour -- 시작 숫자
UNION ALL
SELECT hour + 1 -- 이전 숫자에 1을 더함
FROM hours
WHERE hour < 23 -- 종료 조건
-- hour이 22이면 조건을 만족해 재귀 실행 -> 23 생성
-- hour이 23이면 조건을 만족하지 못해 종료 -> 24 생성 x
)
ORACLE
내가 작성한 오답
: 결과가 있는 값만 출력되어 7시 전의 시간들과 20시 이후의 시간들은 출력되지 않았다.
SELECT CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER) HOUR, COUNT(ANIMAL_ID) COUNT
FROM ANIMAL_OUTS
WHERE CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER) >= 0
AND CAST(TO_CHAR(DATETIME,'HH24MMSS') AS NUMBER) < 230001
GROUP BY CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER)
ORDER BY HOUR

내가 작성한 오답2
: 0시부터 23시까지라고 해서 23시 01부터 23시 59분까지는 포함하지 않는다고 생각해 WHERE조건을 잘못 걸었다.

WITH HOURS AS (
SELECT LEVEL - 1 AS HOUR
FROM DUAL
CONNECT BY LEVEL <= 24
),
ANIMAL AS (SELECT CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER) HOUR, ANIMAL_ID
FROM ANIMAL_OUTS
WHERE CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER) >= 0
AND CAST(TO_CHAR(DATETIME,'HH24MM') AS NUMBER) < 2301
)
SELECT B.HOUR, COUNT(A.ANIMAL_ID) COUNT
FROM ANIMAL A
RIGHT JOIN HOURS B ON A.HOUR = B.HOUR
GROUP BY B.HOUR
ORDER BY HOUR
내가 작성한 정답
WITH HOURS AS (
SELECT LEVEL - 1 AS HOUR
FROM DUAL
CONNECT BY LEVEL <= 24
),
ANIMAL AS (SELECT CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER) HOUR, ANIMAL_ID
FROM ANIMAL_OUTS
WHERE CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER) >= 0
AND CAST(TO_CHAR(DATETIME,'HH24') AS NUMBER) <= 23
)
SELECT B.HOUR, COUNT(A.ANIMAL_ID) COUNT
FROM ANIMAL A
RIGHT JOIN HOURS B ON A.HOUR = B.HOUR
GROUP BY B.HOUR
ORDER BY HOUR
AI의 도움! - ORACLE에서 계층 쿼리
WITH HOURS AS (
//LEVEL은 가상 컬럼으로, 계층 쿼리에서 현재 행의 깊이를 나타낸다.
//CONNECT BY와 함께 사용되고 1부터 시작되어 각 행에 대해 1씩 증가한다
// -> 시간이 0부터 시작하므로 LEVEL-1에서 시작
SELECT LEVEL - 1 AS HOUR
// DUAL은 가상의 테이블로 실제 테이블 없이도 쿼리를 실행할 수 있게 해준다. 특정 값을 반환하거나 계산된 값을 확인하고 싶을 때 유용
// DUAL테이블은 항상 1개의 행과 1개의 열을 가지고 있다.
FROM DUAL
// 계층쿼리를 작성할 때 사용된다. LEVEL이 24이하일 동안 반복적으로 행을 생성한다.
CONNECT BY LEVEL <= 24
)
Share article