찌니의 프로그래밍 삼매경

[SQL] 프로그래머스 입양 시각 구하기(2) ORACLE, MYSQL 본문

SQL/SQL 문제풀이

[SQL] 프로그래머스 입양 시각 구하기(2) ORACLE, MYSQL

zzI니☆ 2021. 7. 5. 00:33
728x90

 

https://programmers.co.kr/learn/courses/30/lessons/59413?language=oracle 

 

코딩테스트 연습 - 입양 시각 구하기(2)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

 

 

 

입양 시각 구하기(1) 의 심화버전이다

 

 

1. ORACLE

 

가상테이블 2개 만들어서 LEFT OUTER JOIN시켜서 뽑아냈다

 

첫번째 가상테이블은 00시부터 23시까지 HOUR를 뽑아내다.

참고한 블로그 url 첨부한다.

https://meyouus.tistory.com/175

 

오라클 순번 채번 CONNECT BY LEVEL 활용하기

안녕하세요. 오라클 디비 이용 시 알아두면 유용한 쿼리가 [CONNECT BY LEVEL]입니다. Connect By Start With는 계층 쿼리로 상하 관계를 질의하는 데 사용하는데요. LEVEL은 순위를 의미합니다. 이를 응용한

meyouus.tistory.com

두번째 테이블은 입양 시각 구하기(1) 에서 HOUR와 COUNT를 뽑아낸 쿼리를 재사용했다.

WITH SET_HOUR AS
(
    SELECT LEVEL - 1 as HOUR FROM DUAL CONNECT BY LEVEL <= 24
)
, SET_COUNT AS
(
    SELECT
        TO_CHAR(DATETIME, 'HH24') AS HOUR
        ,COUNT(*) AS COUNT
    FROM ANIMAL_OUTS 
    GROUP BY TO_CHAR(DATETIME, 'HH24')
)

SELECT
    H.HOUR
    ,NVL(C.COUNT,0) COUNT
FROM
    SET_HOUR H
LEFT OUTER JOIN SET_COUNT C ON H.HOUR = C.HOUR
ORDER BY H.HOUR

 


 

2. MYSQL

 

mysql은 2가지 방법으로 성공했다.

 

  • WITH RECURSIVE 활용

mysql에서 오라클의 connect by level을 사용할 방법을 찾아보니까 WITH RECURSIVE을 사용하는 방법도 있다.

하단에 참고한 url 첨부한다.

https://aljjabaegi.tistory.com/549

 

MySql, MariaDB에서 connect by level 사용방법

MySql, MariaDB에서 connect by level 사용방법 오랜만에 포스팅에서는 MySql, MariaDB에서 connect by level 사용방법을 알아보겠습니다. connect by level 은 증가하거나 감소하는 데이터를 동적으로 생성..

aljjabaegi.tistory.com

WITH RECURSIVE SET_HOUR AS ( 
    SELECT 0 AS HOUR 
        UNION ALL 
    SELECT 1 + SET_HOUR.HOUR 
    FROM SET_HOUR 
    WHERE SET_HOUR.HOUR < 23
)
, SET_COUNT AS
(
    SELECT
        HOUR(DATETIME) AS HOUR
        ,COUNT(*) AS COUNT
    FROM ANIMAL_OUTS 
    GROUP BY HOUR(DATETIME)
)

SELECT
    H.HOUR
    ,IFNULL(C.COUNT,0) COUNT
FROM
    SET_HOUR H
LEFT OUTER JOIN SET_COUNT C ON H.HOUR = C.HOUR
ORDER BY H.HOUR

 


  • SET변수와 LIMIT 활용

SET으로 변수선언하고 LIMIT을 걸어줘서 HOUR 뽑았다.

COUNT는 ORACLE과 동일하게 작성

SET @LEVEL = -1;
WITH SET_HOUR AS
(
    SELECT @LEVEL := @LEVEL + 1 AS HOUR FROM ANIMAL_OUTS LIMIT 24
)
, SET_COUNT AS
(
    SELECT
        HOUR(DATETIME) AS HOUR
        ,COUNT(*) AS COUNT
    FROM ANIMAL_OUTS 
    GROUP BY HOUR(DATETIME)
)

SELECT
    H.HOUR
    ,IFNULL(C.COUNT,0) COUNT
FROM
    SET_HOUR H
LEFT OUTER JOIN SET_COUNT C ON H.HOUR = C.HOUR
ORDER BY H.HOUR
728x90
Comments