본문 바로가기

DB/Oracle

[Oracle] 윈도우 함수/RANK( ) 함수 - 순위 출력 함수, DENSE_RANK( ) 순위 함수, ROW_NUMBER( ) 순위 함수

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 절에 추가해 중복 값 발생에 대처