[Oracle] 오라클 그룹별 순번, 순위 매기기(ROW_NUMBER, RANK) 함수

     

    그룹별 순번매기기 ROW_NUMBER()

    카테고리(CATEGORY_ID)별 저렴한 금액(STANDARD_COST)순으로 순번 매기기

    SELECT 
    A.CATEGORY_ID,
    B.CATEGORY_NAME,
    A.STANDARD_COST,
    ROW_NUMBER() OVER (PARTITION BY A.CATEGORY_ID
    ORDER BY A.CATEGORY_ID, A.STANDARD_COST) AS NUM --그룹별 순번
    FROM
    PRODUCTS A
    INNER JOIN PRODUCT_CATEGORIES B ON A.CATEGORY_ID = B.CATEGORY_ID

    ROW_NUMBER

    카테고리별 가격의 순번을 매기는 쿼리입니다. CPU카테고리에서는 70번까지의 순번이 값이 작은 순에서 큰 순으로 순번이 매겨졌고 그 뒤로 두번째 카테고리인 Video Card의 순번이 매겨지는것을 보실 수 있습니다. PARTITION BY절에 카테고리 (CATEGORY_ID)를 명시해 카테고리 별 파티션이 먼저 만들어졌고 ORDER BY절에서 카테고리별 가격을 정렬하여 순번을 부여하였습니다.

     

    그룹별 순위매기기 RANK()

    카테고리(CATEGORY_ID)별 저렴한 금액(STANDARD_COST)순으로 순위 매기기

    SELECT 
    A.CATEGORY_ID,
    B.CATEGORY_NAME,
    A.STANDARD_COST,
    RANK() OVER (PARTITION BY A.CATEGORY_ID
    ORDER BY A.CATEGORY_ID, A.STANDARD_COST) AS RANKING --그룹별 순위
    FROM
    PRODUCTS A
    INNER JOIN PRODUCT_CATEGORIES B ON A.CATEGORY_ID = B.CATEGORY_ID

    RANK

    순위를 매기는 RANK()는 순번을 매기는 ROW_NUMBER()과 사용방식은 같고 리턴되는 값이 순번이냐 순위냐만 다릅니다. 위의 결과를 보시면 3000.41이라는 값을가진 데이터가 3개가 있습니다. 이 데이터는 서로 값이 같기때문에 동등한 순위를 가집니다. 위의 결과를 보시면 66이라는 순위로 3개가 출력되고 그 다음번 순위는 3번을 건너뛰어 69가 출력되는것을 보실 수 있습니다. 1등뒤에 공동 2등 있다면 3등은 없고 4등이 있는셈입니다.

     

    같은 순위가 나왔을 경우 다음 순위가 건너띄게 하고 싶지 않을 경우

    RANK함수는 같은 순위의 데이터가 나왔을 경우 그 다음 순위는 같은 순위의 데이터만큼 건너띄고 출력합니다. 하지만 건너띄고 싶지 않을 경우도 있을 수 있습니다. 이럴 경우에는 RANK() 함수대신 DENSE_RANK()를 사용하면 됩니다. 

    SELECT 
    A.CATEGORY_ID,
    B.CATEGORY_NAME,
    A.STANDARD_COST,
    DENSE_RANK() OVER (PARTITION BY A.CATEGORY_ID
    ORDER BY A.CATEGORY_ID, A.STANDARD_COST) AS RANKING --그룹별 순위
    FROM
    PRODUCTS A
    INNER JOIN PRODUCT_CATEGORIES B ON A.CATEGORY_ID = B.CATEGORY_ID

    순위 건너띄지 않기

    DENSE_RANK()를 사용하시면 동일한 순위가 나왔을 경우 동일한 순위의 데이터만큼 다음번 순위를 건너띄지 않고 바로 다음번 순위를 출력합니다. 1등뒤에 공동 2등 있어도 그 다음번 순위는 3등인 셈입니다.

     

    파티션 별 상위 3개만 조회

    카테고리(CATEGORY_ID)별 저렴한 금액(STANDARD_COST)순으로 3개까지만 조회

    SELECT
    *
    FROM
    (
        SELECT 
        A.CATEGORY_ID,
        B.CATEGORY_NAME,
        A.STANDARD_COST,
        RANK() OVER (PARTITION BY A.CATEGORY_ID
        ORDER BY A.CATEGORY_ID, A.STANDARD_COST) AS RANKING --그룹별 순위
        FROM
        PRODUCTS A
        INNER JOIN PRODUCT_CATEGORIES B ON A.CATEGORY_ID = B.CATEGORY_ID
    )
    WHERE RANKING <=3

    파티션 3개 조회

    순위를 구하는 함수는 다양한 방식으로 응용이 가능합니다. 가장 대표적으로 많이 응용것이 그룹별로 상위 몇개의 데이터만 출력하는 경우가 있습니다. 먼저 그룹별로 등급을 매긴 데이터를 서브쿼리안에 넣고 WHERE절에 생성해준 순위 컬럼인 RANKING <= (NUMBER)을 명시하여 그룹별로 상위 데이터를 출력할 수 있습니다.

     

    [Oracle] 오라클 순번 매기기 (ROWNUM, ROW_NUMBER) 함수

    댓글

    Designed by JB FACTORY