알고리즘/프로그래머스

프로그래머스 - 입양 시각 구하기(2) / Oracle

Hwisaek 2021. 7. 30. 18:35
반응형

문제: https://programmers.co.kr/learn/courses/30/lessons/59413

 

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

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

programmers.co.kr

문제 설명

더보기
문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

HOURCOUNT
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0

 


정답

SELECT
     HOUR
   , COUNT(ANIMAL_ID) COUNT
FROM
    ANIMAL_OUTS O
    RIGHT OUTER JOIN
    (
        SELECT
            LEVEL - 1 AS HOUR
        FROM 
            DUAL
        CONNECT BY 
            LEVEL <= 24
    ) L ON TO_CHAR(O.DATETIME, 'HH24') = L.HOUR
GROUP BY 
    HOUR
ORDER BY 
    HOUR;

풀이

더보기
SELECT
     HOUR
   , COUNT(ANIMAL_ID) COUNT
FROM
    ANIMAL_OUTS O
    RIGHT OUTER JOIN
    (
        SELECT
            LEVEL - 1 AS HOUR
        FROM 
            DUAL
        CONNECT BY 
            LEVEL <= 24
    ) L ON TO_CHAR(O.DATETIME, 'HH24') = L.HOUR
GROUP BY 
    HOUR
ORDER BY 
    HOUR;

  각 시간별로 입양이 몇 건 발생했는지 조회하는 SQL을 작성하는 문제입니다. 각 시간별로 발생한 건 수를 구하는 건 매우 쉽습니다. 그러나 존재하지 않는 시간대를 0으로 처리하는 부분이 문제입니다.

여기서는 LEVEL을 이용해서 0시 ~ 23시의 데이터를 임시로 만들어주는 것이 중요합니다.

 

코드

SELECT
    LEVEL - 1 AS HOUR
FROM 
    DUAL
CONNECT BY 
    LEVEL <= 24

 

결과

 

 오라클에서 LEVEL 이라는 예약어는 계층적 쿼리를 처리할 때 사용합니다. 여기서는 이를 다르게 활용하는데, SELECT 구문에 'LEVEL - 1'을 넣고 CONNECT BY 조건에 'LEVEL <= 24' 를 넣으면 됩니다.

 LEVEL은 1부터 시작하므로 우리는 0시부터 필요하기 때문에 '- 1'을 넣어줍니다. 그리고 23시까지의 데이터이기 때문에 해당 조건을 넣으면 1시 ~ 24시까지의 데이터가 출력되고, 전체 데이터에 '- 1' 연산이 되어 0시 ~ 23시의 데이터가 나오게 됩니다.

 

'LEVEL - 1' 적용 전 / 후
반응형