[SQL문제풀기] 입양 시각 구하기(2)

silver's avatar
Jan 11, 2025
[SQL문제풀기] 입양 시각 구하기(2)

문제

 

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
notion image

내가 작성한 오답2

: 0시부터 23시까지라고 해서 23시 01부터 23시 59분까지는 포함하지 않는다고 생각해 WHERE조건을 잘못 걸었다.
notion image
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

silver