ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Oracle] 윈도우 함수(Window Funtion)_그룹 내 순위 함수
    RDS/Oracle 2019. 3. 20. 07:30
    반응형

    윈도우 함수 종류

    1.그룹 내 순위(RANK) 관련 함수

     - RANK, DENSE_RANK, ROW_NUMBER 함수

    2.그룹 내 집계(AGGREGATE) 관련 함수

     - SUM, MAX, MIN, AVG, COUNT 함수 

    3.그룹 내 행 순서 관련 함수

     - FIRST_VALUE, LAST_VALUE, LAG, LEAD 함수 

    4.그룹 내 비율 관련 함수

     - CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT 함수


    윈도우 함수 문법 

    SELECT WINDOW_FUNCTION (ARGUMENTS) OVER ([PARTITION BY 컬럼] [ORDER BY 절] [WINDOWING 절])

      FROM 테이블명; 

      

    WINDOW_FUNCTION

     - 함수명

    ARGUMENTS (인수) 

     - 함수에 따라 0 ~ N개의 인수가 지정될 수 있습니다.

    PARTITION BY 절

     - 전체 집합을 기준에 의해 소그룹으로 나눌 수 있습니다.

    ORDER BY 절

     - 어떤 항목에 대해 순위를 지정할 지 ORDER BY 절을 기술합니다.

    WINDOWING 절

     - 함수의 대상이 되는 행 기준의 범위를 지정할 수 있습니다.

     

    RANK 함수

     RANK 함수는 ORDER BY를 포함한 쿼리문에서 특정 컬럼에 대한 순위를 구하는 함수입니다. 특정 범위(PARTITION) 내에서 순위를 구할 수도 있고 전체 데이터에 대한 순위를 구할 수도 있습니다. 또한 동일한 값에 대해서는 동일한 순위를 부여하게 됩니다.

    1
    2
    3
    4
    5
    6
    SELECT JOB
         , ENAME
         , SAL
         , RANK() OVER (ORDER BY SAL DESC) AS "전체 순위"
         , RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) AS "업무 순위"
      FROM EMP;
    cs

     

     업무 구분이 없는 "전체 순위" 컬럼에서 FORD와 SCOTT, WARD와 MARTIN은 동일한 급여이므로 같은 순위이고, 업무를 PARTITION으로 구분한 "업무 순위"의 경우 같은 업무 내 범위에서만 순위를 부여합니다.


    DENSE_RANK 함수 

      DENSE_RANK 함수는 RANK 함수와 비슷하지만, 동일한 순위를 하나의 건수로 취급하는 것이 차이입니다.

    1
    2
    3
    4
    5
    6
    SELECT JOB
         , ENAME
         , SAL
         , RANK() OVER (ORDER BY SAL DESC) AS "RANK"
         , DENSE_RANK() OVER (ORDER BY SAL DESC) AS "DENSE_RANK"
      FROM EMP; 
    cs

     

     FORD와 SCOTT, WARD와 MARTIN은 동일한 급여이므로 RANK오 DENSE_RANK 컬럼에서 모두 같은 순위를 부여합니다. RANK와 DENSE_RANK의 차이를 알 수 있는 데이터는 FORD와 SCOTT의 다음 순위인 JONES의 경우 RANK는 4등으로 DENSE_RANK는 3등으로 표시되는 것으로 확인할 수 있습니다. 또한, WARD와 MARTIN의 다음 순위인 ADAMS의 경우 RANK는 12등으로 DENSE_RANK는 10등으로 표시됩니다.

     

    ROW_NUMBER 함수 

     ROW_NUMBER 함수는 RANK나 DENSE_RANK 함수가 동일한 값에 대해서는 동일한 순위를 부여하는데 반해, 동일한 값이라도 고유한 순위를 부여합니다.

    1
    2
    3
    4
    5
    6
    SELECT JOB
         , ENAME
         , SAL
         , RANK() OVER (ORDER BY SAL DESC) AS "RANK"
         , ROW_NUMBER() OVER (ORDER BY SAL DESC) AS "ROW_NUMBER"
      FROM EMP; 
    cs

      

     FORD와 SCOTT, WARD와 MARTIN은 동일한 급여이므로 RANK는 같은 순위를 부여했지만, ROW_NUMBER의 경우 동일한 순위를 배제하기 위해 고유한 순위를 정합니다.

    반응형

    댓글

Designed by Tistory.