본문 바로가기

방법/알고리즘&코딩 테스트

[Programmers] 입양 시각 구하기(2) Oracle

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

 

Oracle

-- 코드를 입력하세요
SELECT hours.hour, NVL(cnt, 0) "COUNT"
    FROM (SELECT TO_CHAR(datetime, 'HH24') as hour, COUNT(*) cnt 
            FROM animal_outs 
            GROUP BY TO_CHAR(datetime, 'HH24')) outs, 
        (SELECT LEVEL-1 AS hour
          FROM DUAL
       CONNECT BY LEVEL <=24) hours
    WHERE hours.hour = outs.hour(+)
    
    ORDER BY hour

먼저 인라인 뷰(Inline View) outs를 살펴보면,

1. DATETIME을 24시간 형태 문자열로 바꾼다.

2. GROUP BY을 사용하여, 시간 별 칼럼 개수를 구한다. 

 

다음 인라인 뷰 hours를 살펴보면,

개요. CONNECT BY 문을 사용하여 1~24을 표현

    (원래, 계층적 데이터를 표현하기 위해서 사용된다.)

1. CONNECT BY문의 조건을 LEVEL이 24와 같거나 작을 때까지로 지정

2. LEVEL-1을 출력 (원래, LEVEL은 계층(깊이)를 의미한다.)

 

마지막으로 바깥 쿼리를 보면,

1. 시간별(hours.hour)로 입양된 동물(NVL(cnt, 0))을 출력

    NVL : 첫번째 인자(cnt)가 NULL이라면 두번쨰 인자(0)으로 치환한다.

2. hours의 hour과 outs의 hour을 기준으로 JOIN

3. 시간 순으로 정렬하기 위해 ORDER BY hour