그룹별 순번매기기 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
카테고리별 가격의 순번을 매기는 쿼리입니다. 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()는 순번을 매기는 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
순위를 구하는 함수는 다양한 방식으로 응용이 가능합니다. 가장 대표적으로 많이 응용것이 그룹별로 상위 몇개의 데이터만 출력하는 경우가 있습니다. 먼저 그룹별로 등급을 매긴 데이터를 서브쿼리안에 넣고 WHERE절에 생성해준 순위 컬럼인 RANKING <= (NUMBER)을 명시하여 그룹별로 상위 데이터를 출력할 수 있습니다.
'DB > Oracle' 카테고리의 다른 글
[Oracle] SELECT문 합치기 유니온(UNION, UNION ALL) 합집합 (0) | 2019.12.14 |
---|---|
[Oracle] 오라클 WITH절 사용법 & 예제 (임시 테이블 만들기) (1) | 2019.12.09 |
[Oracle] 오라클 순번 매기기 (ROWNUM, ROW_NUMBER) 함수 (0) | 2019.12.07 |
[Oracle] 오라클 첫번째 NULL값의 다음 값 찾기 COALESCE 함수 사용법 (11) | 2019.12.03 |