RANK( ) 함수 - 순위 출력 함수
- 주어진 컬럼 값의 그룹에서 값의 순위를 계산한 후 순위 출력
- 같은 순위를 가지는 순위 기준에 대해서는 같은 출력 값을 가져 결과가 연속하지 않을 수 있음
- top-N과 bottom-N 등 순위를 출력하는 리포팅 작업에 유용함
- 특정 데이터 순위만 볼 수도 있고, 전체 데이터 순위를 다 볼 수 있는 두 가지 경우가 존재함
(1) 특정 데이터 순위 확인 : 싱글 그룹 함수
- 문법
RANK ( 조건 값 ) WITHIN GROUP ( ORDER BY 조건 값 컬럼명 [ ASC | DESC ] )
- 조건 값과 컬럼명은 반드시 동일한 컬럼이어야 함
- 예시
SELECT RANK ( 'SMITH' ) WITHIN GROUP ( ORDER BY ename ) FROM emp ;
(2) 전체 순위 확인 : 그룹 함수
- 문법
RANK ( ) OVER ( ORDER BY 조건컬럼명 [ ASC | DESC ] )
- 예시
SELECT empno, ename, RANK( ) OVER ( ORDER BY sal ) AS RANK_ASC,
RANK( ) OVER ( ORDER BY sal DESC) AS RANK_DESC
FROM emp;
- RANK를 중복으로 줄 경우 가장 마지막에 정렬을 준 기준으로 값이 정렬됨
- 그룹별 순위를 구할 경우
- 예시 : emp 테이블을 조회해 사번, 이름, 급여, 부서번호, 부서별 급여 순위를 출력하시오
SELECT empno, ename, sal, deptno,
rank ( ) over ( partition by deptno order by sal desc ) "RANK"
FROM emp;
- 분류 조건이 늘어날 경우 PARTITION BY 이후에 작성 [ 콤마( , )로 구분함 ]
- 예시 : emp 테이블을 조회해 사번, 이름, 급여, 부서번호, 부서 및 직업별 급여 순위를 출력하시오
SELECT empno, ename, sal, deptno,
rank ( ) over ( partition by deptno order by sal, job desc ) "RANK"
FROM emp;
DENSE_RANK 순위 함수
- RANK 함수와 비슷
- 동일 순위를 하나의 건수로 취급해 연속된 순위를 보여줌
- 동일 순위를 서로 다른 순위로 바꾸는 것이 아닌 해당 순위의 다음 수부터 이어서 순위를 책정한다는 것
- 문법
DENSE_RANK( ) OVER ( ORDER BY 컬럼명 [ ASC | DESC ] )
ROW_NUMBER( )
- 동일한 값이라도 고유 순위 부여 ( 동점 순위 허용 X )
- Oracle의 경우 ROWID가 작은 값에 먼저 순위 부여
- 중복 순위를 허용하지 않아 RANK나 DENSE_RANK 보다 더 많이 사용됨
- 허나 ROWID가 바뀐다면 항상 같은 결과의 순위를 보여줄 수 없음
-- ROWID가 바뀌는 경우는 해당 DATA를 지우고 다시 INSERT하는 경우
- 데이터 마이그레이션 후 특정 데이터의 정렬 순서가 바뀌는 경우는 보통 명확한 정렬 컬럼이 지정되지 않아서임
-- 항상 같은 정렬 순서를 보장하기 위해서는 반드시 유니크한 컬럼( PK 컬럼 )을 기술해야 함
-- ORDER BY절 컬럼이 유니크하지 않을 때는 같은 값에 대한 정렬은 어떻게 처리해야 하는지 생각해야 함
-- 책 205 페이지.
--> emp 테이블에서 sal로만 row_number로 정렬할 경우 ROWID에 따라 값이 상시로 변화할 수 있기에 row_number 정렬시 유니크 값인 PK를 order by 절에 추가해 중복 값 발생에 대처
'DB > Oracle' 카테고리의 다른 글
[Oracle] RATIO_TO_REPORT( ) 함수 - 비율 구하기 (0) | 2021.08.11 |
---|---|
[Oracle] SUM ( ) OVER를 활용한 누계 구하기 (0) | 2021.08.11 |
[Oracle] LAG( )함수 - 이전 행 값 가져오기, LEAD( )함수 - 이후 행 값 가져오기 (0) | 2021.08.09 |
[Oracle] 분석함수, 윈도함수 - GROUPING SETS ( ), LISTAGG( ), PIVOT( ), UNPIVOT( ) 함수 (0) | 2021.08.03 |
[Oracle] 분석함수, 윈도함수 - CUBE (소계와 전체 합계 출력) (0) | 2021.08.03 |