Oracle Database TIP
오라클에서 순위를 쉽게 부여하는법(Rank() Function) 31 10 99,999+

by 구루비 RANK() DENSE_RANK( ) 순위 [2002.04.14]


  우리가 일반적으로 점수의 순위는 ORDER BY DESC를 해서 볼수가 있다.

  하지만 똑같은 점수를 가진 사람들이 많이 나올때, 예를 들면.100, 90, 90, 80 이렇게 점수가 나오면 순위를 1,2,2,4 이렇게 부여 해야 한다.

  이럴 경우 RANK 함수를 사용하여 쉽게 순위를 부여 할 수 있다.

간단 예제

  SCOTT 사용자로 접속하여 테스트를 진행.

  
-- RANK() 함수를 사용하여 급여 순으로 순위를 부여한 예제 입니다.  
-- RK의 출력값을 보면 급여가 같으면 같은 순위로 부여가 됩니다. 

SQL> SELECT empno, ename, sal, 
     RANK() OVER (ORDER BY sal DESC ) as rk
     FROM emp; 

    EMPNO ENAME           SAL         RK
--------- ---------- --------- ----------
     7839 KING            5000          1
     7788 SCOTT           3000          2
     7902 FORD            3000          2
     7566 JONES           2975          4
     7698 BLAKE           2850          5
     7782 CLARK           2450          6
     7499 ALLEN           1600          7
     7844 TURNER          1500          8
     7934 MILLER          1300          9
     7521 WARD            1250         10
     7654 MARTIN          1250         10
     7876 ADAMS           1100         12
     7900 JAMES            950         13
     7369 SMITH            800         14
    

그룹별로 순위를 부여 하는 법

  아래 예제는특정한 그룹별로 순위를 부여 하는 예제이다.

     
SQL> SELECT deptno, ename, sal, 
     RANK() OVER (PARTITION BY deptno ORDER BY sal DESC ) as rk 
     FROM emp ;
 
 DEPTNO ENAME           SAL        RK
------- ---------- -------- ---------
     10 KING           5000         1
     10 CLARK          2450         2
     10 MILLER         1300         3
     20 SCOTT          3000         1
     20 FORD           3000         1
     20 JONES          2975         3
     20 ADAMS          1100         4
     20 SMITH           800         5
     30 BLAKE          2850         1
     30 ALLEN          1600         2
     30 TURNER         1500         3
     30 WARD           1250         4
     30 MARTIN         1250         4
     30 JAMES           950         6
    

DENSE_RANK() 함수

  DENSE_RANK() 함수는 중복 RANK의 수와 무관하게 numbering을 한다. 1등, 2등, 2등 이렇게 2등이 중복 되었는데 4등이 아니라 3등이 부여 된다.

 
SQL> SELECT empno, ename, sal,  
     DENSE_RANK() OVER (ORDER BY sal DESC ) as rk
     FROM emp;     
    
    EMPNO ENAME             SAL        RK
--------- ---------- ---------- ---------
     7839 KING             5000         1
     7788 SCOTT            3000         2
     7902 FORD             3000         2
     7566 JONES            2975         3
     7698 BLAKE            2850         4
     7782 CLARK            2450         5
     7499 ALLEN            1600         6
     7844 TURNER           1500         7
     7934 MILLER           1300         8
     7521 WARD             1250         9
     7654 MARTIN           1250         9
     7876 ADAMS            1100        10
     7900 JAMES             950        11
     7369 SMITH             800        12 
    

- 강좌 URL : http://www.gurubee.net/lecture/1284

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 김정식 [2003.11.26 18:27:20]
======== 보충설명 =======
# OVER analytic_clause
해당 함수가 쿼리 결과 집합에 대해 적용되라는 지시어로써 FROM, WHERE, GROUP BY와
HAVING구 이후에 계산되어 진다.
SELECT 구 또는 ORDER BY 구에 Analytic Function을 사용할 수 있다.

- PARTITION BY 구
하나 이상의 컬럼 또는 적합한 표현식이 사용될 수 있고 하나 이상의 컬럼 또는
표현식에 의한 그룹으로 쿼리의 결과를 파티션한다.
이 구가 생략되면 단일 그룹처럼 쿼리 결과 집합이 처리된다.

- ORDER BY 구
하나 이상의 컬럼 또는 적합한 표현식이 사용될 수 있고
하나 이상의 컬럼 또는 표현식을 기준으로 파티션 내의 데이터를 정렬한다.
표현식은 컬럼의 별칭 또는 위치를 나타내는 숫자를 사용할 수 없다.

www.en-core.com참고

by 김정식 [2003.11.27 22:47:35]
-- 참고 2
-- 부서별 직업별 급여 합계와, 직업별 급여 합계가 가장 큰 금액
SELECT deptno, job, SUM(SAL) sum_sal,
MAX(SUM(sal)) OVER (PARTITION BY deptno)
FROM emp
GROUP BY deptno, job

by 이상선 [2007.04.05 18:00:31]
허...rank 함수가 있었군요... 전 아직도 count(enmae)+1 하고 있는데.ㅡㅡ;저걸 몰랐다니 아주 유용한 정보입니다. ^^;

by SOUL [2008.08.15 13:57:50]
첫번째 줄
ODRDER BY desc --> ORDER BY desc 로 수정 해주세요

by 왕희복 [2008.09.08 09:12:11]
언제봐도 그룹함수들은 오묘해 ㅡ.ㅡ

by finecomp [2010.01.07 15:22:11]
row_number() over()도 rank와 마찬가지로 순위매기는 데 쓰는 함수 중 하나입니다...^^;
rank, dense_rank, row_number 가 각각 동순위등의 처리방법에 차이가 있는 것 뿐 입니다.

by bluewt [2010.04.16 15:18:01]
감사합니다.^^

by 정존 [2010.12.15 11:25:05]
좋은 내용 감사합니다.^^

by 정명호 [2020.08.24 14:47:59]

정말 감합니다. 보충 설명에 PARTITION BY 구에 대해 다시 설명해주셔서 정말 감사합니다. 

즉, PARTITION BY 구는 최소 2개이상의 컬럼으로 Group by 할때만 사용하는거란걸 몰랐습니다. 

하나만있는 컬럼은 생략하거나 가상의 컬럼을 만들어줘야 한다는걸 알았습니다. 

감사합니다.


by 마농 [2020.08.24 16:24:40]

전혀 다르게 이해하셨네요???
이대로 틀린 정보를 암기하실까봐 걱정이 되어서 댓글 적습니다.

- 원본 : 하나 이상의
- 오해 : 2개 이상의(X)
- 오해 : 하나만 있는 컬럼은 생략(X)
- 오해 : 가상의 컬럼을 만들어 줘야 한다(X)

- 원본 : 그룹으로 쿼리의 결과를 파티션한다.
- 오해 : Group by 할때만 사용

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입