DB: Rank Over & Row_number Over

    DB: Rank Over & Row_number Over

    2019, Jul 15    

    Rank Over VS Row_number Over

    어떤 SCORE 에 의해 데이터를 정렬해야 할 때 이 두 가지의 함수 중 적절한 함수를 쓰도록 한다.

    Rank Over()

    기준 데이터를 정렬했을 때 동일한 값의 데이터는 동일한 정렬값을 부여하는 함수. 함수명 그대로 RANK

    예
    SELECT NUM, NM, RANK () OVER (ORDER BY NUM DESC) RANK
      FROM (SELECT 1 AS NUM, 'a1' NM FROM DUAL
            UNION ALL
            SELECT 2 AS NUM, 'a2' NM FROM DUAL
            UNION ALL
            SELECT 3 AS NUM, 'a3' NM FROM DUAL
            UNION ALL
            SELECT 4 AS NUM, 'a4' NM FROM DUAL
            UNION ALL
            SELECT 4 AS NUM, 'a5' NM FROM DUAL
            UNION ALL
            SELECT 4 AS NUM, 'a6' NM FROM DUAL
            UNION ALL
            SELECT 5 AS NUM, 'a7' NM FROM DUAL)
     WHERE 1 = 1;
    

    결과

    NUM NM RANK
    5 a7 1
    4 a4 2
    4 a6 2
    4 a5 2
    3 a3 5
    2 a2 6
    1 a1 7

    Row_number Over()

    기준 데이터를 정렬했을 때 동일한 값의 데이터와 상관없이 기준 데이터값을 정렬하여 순차적으로 정렬값을 부여한 함수

    SELECT NUM, NM, ROW_NUMBER () OVER (ORDER BY NUM DESC) RANK
      FROM (SELECT 1 AS NUM, 'a1' NM FROM DUAL
            UNION ALL
            SELECT 2 AS NUM, 'a2' NM FROM DUAL
            UNION ALL
            SELECT 3 AS NUM, 'a3' NM FROM DUAL
            UNION ALL
            SELECT 4 AS NUM, 'a4' NM FROM DUAL
            UNION ALL
            SELECT 4 AS NUM, 'a5' NM FROM DUAL
            UNION ALL
            SELECT 4 AS NUM, 'a6' NM FROM DUAL
            UNION ALL
            SELECT 5 AS NUM, 'a7' NM FROM DUAL)
     WHERE 1 = 1;
    
    

    결과

    NUM NM RANK
    5 a7 1
    4 a4 2
    4 a6 3
    4 a5 4
    3 a3 5
    2 a2 6
    1 a1 7