Oracle SQLランキング関数-RANK()OVER、DENSE RANK()OVER、ROW NUMBER()OVER


ランキング関数

  • 特定の列に基づいてサイズでソートされる関数です.

  • RANK() OVER, DENSE_RANK() OVER, ROW_NUMBER() OVER

  • グループ内のランキングはRANK(PARTION~)関数を使用する
    1) RANK() OVER
    ▲並べ替え時に重複値(同値)が発生した場合、重複値の個数をスキップして次の並べ替えを行う
    ex) 90,80,80,80,70 =>(1,2,2,2,5..)
    用.SELECT節
  • (フォーマットを使用)
    RANK() OVER(ORDER BY 컬럼명 (ASC|DESC)) (AS 별칭)
    使用例)従業員表において、80番部署の従業員の中で最も早い入社年度の従業員から順位照会を開始する
    Aliasは従業員番号、従業員名、入社日、ランキング
    SELECT EMPLOYEE_ID AS  사원번호, 
                EMP_NAME AS 사원명, 
                HIRE_DATE AS 입사일자, 
                RANK() OVER(ORDER BY HIRE_DATE ASC) AS 순위
     FROM HR.EMP
    WHERE DEPARTMENT_ID=80;
    2) DENSE_RANK() OVER
    を選択します.並べ替えを繰り返した後、次の順序で連続する値を指定します.
    ex) 90,80,80,80,70 =>1,2,2,2,3...
    使用例)商品表において販売価格の順にDENSE PARK()関数として等級を指定する
     SELECT PROD_ID AS 상품코드,
                 PROD_NAME AS 상품명,
                 PROD_PRICE AS 판매가, 
                 RANK() OVER(ORDER BY PROD_PRICE DESC)AS 순위1,
                 DENSE_RANK() OVER(ORDER BY PROD_PRICE DESC) AS 순위2
      FROM PROD;
    3) ROW_NUMBER() OVER
    最も一般的な
    繰り返し値を考慮せずにSEQUENCE(シーケンス値)を返します.
    ex)90,80,80,80,70 => 1,2,3,4,5,....
    使用例)商品表において販売価格の順にDENSE PARK()関数として等級を指定する
     SELECT PROD_ID AS 상품코드,
                 PROD_NAME AS 상품명,
                 PROD_PRICE AS 판매가, 
                 RANK() OVER(ORDER BY PROD_PRICE DESC)AS 순위1,
                 DENSE_RANK() OVER(ORDER BY PROD_PRICE DESC) AS 순위2,
                 ROW_NUMBER() OVER(ORDER BY PROD_PRICE DESC) AS 순위3
       FROM PROD;
    4)グループ内ランキング
    ▲グループごとのランキング関数
    (フォーマットを使用)
    RANK()OVER(PARTIONBYサビ名1[サビ名2...]
    ORDER BY列名11[,列名12...][ASC|DESC])
    -列名1[,列名2...]:グループ標準列名
    -列名11[,列名12...]:並べ替えられた標準列名
    使用例)商品表でカテゴリ別に商品の販売価格で並べ替えてください
    
    SELECT PROD_ID AS 상품코드,
                  PROD_NAME AS 상품명, 
                  PROD_LGU AS 분류코드, 
                  PROD_PRICE AS 가격, 
                  RANK() OVER(PARTITION BY PROD_LGU
                              ORDER BY PROD_PRICE DESC) 순위
      FROM PROD;