728x90
- target: RANK, DENSE_RANK 함수 사용법 (feat. OVER, PARTITION BY)
- method:
1. RANK / DENSE_RANK
오라클에서 성적, 급여, 매출 등 순위를 구하기 위해서 순위 함수(RANK, DENSE_RANK)를 사용
순위 함수의 순위는 OVER ㅎ마수 내부의 ORDER BY 컬럼 값으로 결정
SELECT ENAME
, SAL
, RANK() OVER (ORDER BY SAL DESC) RANK
, DENSE_RANK() OVER (ORDER BY SAL DESC) DENSE_RANK
FROM EMP
ORDER BY SAL DESC
/*
ENAME | SAL | RANK | DENSE_RANK
KING | 5000 | 1 | 1
SCOTT | 3000 | 2 | 2
FORD | 3000 | 2 | 2
JONES | 2975 | 4 | 3
BLAKE | 2850 | 5 | 4
CLARK | 2450 | 6 | 5
ALLEN | 1600 | 7 | 6
TURNER | 1500 | 8 | 7
*/
※ RANK() 함수는 2순위가 2명이므로, 3순위를 건너뛰고 2순위 다음은 4 순위로 표시
※ DENSE_RANK() 함수는 2순위가 2명이어도, 다음 순위는 3순위로 표시
2. 중복 순위 값 제거
순위가 중복되지 않도록 하기 위해서 OVER 함수 내부에 ORDER BY 컬럼을 추가하여 세부적인 순위를 설정
SELECT ENAME
, SAL
, COMM
, RANK() OVER (ORDER BY SAL DESC, COMM DESC) RANK
FROM EMP
ORDER BY SAL DESC
, COMM DESC
/*
ENAME | SAL | COMM | RANK
KING | 5000 | 0 | 1
SCOTT | 3000 | 100 | 2
FORD | 3000 | 0 | 3
JONES | 2975 | 0 | 4
BLAKE | 2850 | 50 | 5
CLARK | 2450 | 50 | 6
ALLEN | 1600 | 300 | 7
TURNER | 1500 | 0 | 8
*/
3. 그룹별 순위 구하기
그룹별 순위 부여 시, PARTITION BY 절을 추가하여 해당 그룹 내에서의 순위 표시
SELECT DEPT
, ENAME
, SAL
, COMM
, RANK() OVER (PARTITION BY DEPT ORDER BY SAL DESC, COMM DESC) RANK
FROM EMP
ORDER BY DEPT
, SAL DESC
, COMM DESC
/*
DEPT | ENAME | SAL | COMM | RANK
ACCOUNTING | KING | 5000 | 0 | 1
ACCOUNTING | CLARK | 2450 | 50 | 2
RESEARCH | SCOTT | 3000 | 100 | 1
RESEARCH | FORD | 3000 | 0 | 2
RESEARCH | JONES | 2975 | 0 | 3
SALES | BLAKE | 2850 | 0 | 1
SALES | ALLEN | 1600 | 300 | 2
SALES | TURNER | 1500 | 0 | 3
*/
3. 그룹별 최소값, 최대값 구하기
KEEP() 함수와 FIRST/LAST 키워드를 통해 DENSE_RANK 함수에서 추출
SELECT DEPT
, ENAME
, SAL
, MIN(SAL) DEEP(DENSE_RANK FIRST ORDER BY SAL) OVER(PARTITION BY DEPT) SAL_MIN
, MAX(SAL) DEEP(DENSE_RANK LAST ORDER BY SAL) OVER(PARTITION BY DEPT) SAL_MAX
FROM EMP
ORDER BY DEPT
, SAL DESC
/*
DEPT | ENAME | SAL | SAL_MIN | SAL_MAX
ACCOUNTING | KING | 5000 | 2450 | 5000
ACCOUNTING | CLARK | 2450 | 2450 | 5000
RESEARCH | FORD | 3000 | 2975 | 3000
RESEARCH | SCOTT | 3000 | 2975 | 3000
RESEARCH | JONES | 2975 | 2975 | 3000
SALES | BLAKE | 2850 | 1500 | 2850
SALES | ALLEN | 1600 | 1500 | 2850
SALES | TURNER | 1500 | 1500 | 2850
*/
- source:
[Oracle] 오라클 RANK, DENSE_RANK 순위 함수 사용법 (over, partition by)
오라클에서 성적, 급여, 매출 등 순위를 구하기 위해서 순위 함수(RANK, DENSE_RANK)를 사용하면 된다. 순위 함수의 순위는 OVER 함수 내부의 ORDER BY 컬럼 값으로 결정된다. RANK() : 중복 순위 개수만큼
gent.tistory.com
728x90
'Dev > DBMS' 카테고리의 다른 글
[Oracle] NVL / NVL2 / DECODE (1) | 2023.10.31 |
---|---|
[Oracle] Oracle 데이터를 Json 형태 문자열로 변환 [오라클 11g 이하] (0) | 2023.10.30 |
[Oracle] Oracle 데이터를 Json 형태로 변환 [오라클 12c 이상] (0) | 2023.10.30 |
[PostgreSQL] 쿼리 실행 통계 확인을 위한 pg_stat_monitor (0) | 2023.01.10 |
[PostgreSQL] Slow Query를 감지하기 위한 3가지 방법 (0) | 2023.01.10 |