ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스_SQL] 입양시각구하기(2)
    프로그래머스_코딩테스트 2022. 7. 7. 16:47

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

     

    ANIMAL_OUTS 테이블 예시

    A349480 Dog 2013-12-22 11:30:00 Daisy Spayed Female
    A349733 Dog 2017-09-27 19:09:00 Allie Spayed Female
    A349990 Cat 2018-02-02 14:18:00 Spice Spayed Female
    A349996 Cat 2018-02-02 14:17:00 Sugar Neutered Male
    A350276 Cat 2018-01-28 17:51:00 Jewel Spayed Female

    오라클 만이 가진 강력한 기능 중 하나로,  테이블에 계층형 데이터 존재하는 경우 이를 조회하기 위한 쿼리를 뜻한다.
    계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다.

     

    START WITH 절은 계층 구조 전개의 시작 위치를 지정한다.


    CONNECT BY 절은 다음에 전개될 자식 데이터를 지정하는데, PRIOR를 주로 사용해서 지정한다.

    이때 PRIOR 자식 = 부모 형태를 쓸 경우 순방향 전개, PRIOR 부모 = 자식 형태를 쓸 경우 역방향 전개를 한다.


    CONNECT BY 절에서 [NOCYCLE]은 데이터를 전개하면서 중복 데이터가 나타는 것을 방지해준다.


    ORDER SIBLINGS BY 은 형제 노드(동일 LEVEL) 사이에서 정렬을 수행해준다.

     

    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

     

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

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

     

    CONNECT BY 문을 사용하여 1~24을 표현,  계층적 데이터를 표현하기 위해서 사용

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

    2. SELECT (LEVEL-1) AS HOUR FROM DUAL CONNECT BY LEVEL <= 24 

    이 코드는 순차적 목록을 만들 때 유용한 코드이다. 

     

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

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

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

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

     

    SELECT HOUR, COUNT(O.DATETIME) AS COUNT --(1)
    FROM
    (
        SELECT LEVEL-1 AS HOUR
        FROM DUAL 
        CONNECT BY LEVEL<25
    )A 
    LEFT JOIN ANIMAL_OUTS O --(2)
    ON A.HOUR = TO_CHAR(O.DATETIME,'HH24') --(3)
    GROUP BY HOUR --(4)
    ORDER BY HOUR; --(5)

    1. COUNT(*) 로 작성하게 되면, 해당 시간에 데이터가 없어도 1 로 카운팅 되기 때문에 ANIMAL_OUTS의 DATETIME 컬럼 으로 묶어준다.

    2. 0~23에 데이터가 없어도 출력이 되어야 하므로 LEFT JOIN 을 사용한다.

    3. JOIN 조건으로, ANIMAL_OUTS의 DATETIME 컬럼을 'HH24' 로 변환시켜준다.

     

     

     

     

     

     

    https://cherry-beer.tistory.com/5
    반응형
Designed by Tistory.