Oracle/SQL2012. 1. 16. 21:18






예제로 풀어보는 오라클 분석용 함수

●RANK(), DENSE_RANK()의 사용법

RANK()는 데이터의 순위를 나타내는 함수로, 동률일 경우 그 다음에 순위가 누락된다.
DENSE_RANK()도 마찬가지로 데이터의 순위를 나타내는 함수지만, 동률일 경우가 있더라도 바로 다음 숫자가 나온다.
예를 들어, 다음과 같은 점수분포라면,
--------------
이름     점수
--------------
홍길동    10
장기현    50
장동건    30
조인성    20
고길동    20
--------------
의 데이터를 RANK() 함수로 점수가 높은 순서대로 나열한다면, 다음과 같다.
--------------
이름     등수
--------------
장기현    1
장동건    2
조인성    3
고길동    3
홍길동    5
--------------

반면에 DENSE_RANK() 함수로 점수가 높은 순서대로 나열한다면, 다음과 같다.
--------------
이름     등수
--------------
장기현    1
장동건    2
조인성    3
고길동    3
홍길동    4
--------------

다음의 예문을 보면 잘 이해될 것이다.

==================================================================

우선 테이블의 구조를 보자

SQL> set lines 80
SQL> desc temp
 이름        널?     유형
 ----------------------------------------- -------- ----------------------------
 EMP_ID        NOT NULL NUMBER
 EMP_NAME       NOT NULL VARCHAR2(10)
 BIRTH_DATE         DATE
 DEPT_CODE       NOT NULL VARCHAR2(6)
 EMP_TYPE         VARCHAR2(4)
 USE_YN        NOT NULL VARCHAR2(1)
 TEL          VARCHAR2(15)
 HOBBY          VARCHAR2(30)
 SALARY          NUMBER
 LEV          VARCHAR2(4)
 
데이터는 어떤지 보자.

SQL> set lines 200
SQL> select * from temp;

    EMP_ID EMP_NAME   BIRTH_DA DEPT_C EMP_ U TEL      HOBBY    SALARY LEV
---------- ---------- -------- ------ ---- - --------------- ------------------------------ ---------- ----
  19970101 김길동     74/01/25 AA0001 정규 Y       등산        100000000 부장
  19960101 홍길동     73/03/22 AB0001 정규 Y       낚시         72000000 과장
  19970201 박문수     75/04/15 AC0001 정규 Y       바둑         50000000 과장
  19930331 정도령     76/05/25 BA0001 정규 Y       노래         70000000 차장
  19950303 이순신     73/06/15 BB0001 정규 Y            56000000 대리
  19966102 지문덕     72/07/05 BC0001 정규 Y            45000000 과장
  19930402 강감찬     72/08/15 CA0001 정규 Y            64000000 차장
  19960303 설까치     71/09/25 CB0001 정규 Y            35000000 사원
  19970112 연흥부     76/11/05 CC0001 정규 Y            45000000 대리
  19960212 배뱅이     72/12/15 CD0001 정규 Y            39000000 과장

10 개의 행이 선택되었습니다.


Q : 위의 TEMP 테이블의 SALARY 가 높은 순서대로 순위를 부여하는 SQL을 만드시오.
출력은 EMP_ID, EMP_NAME, SALARY, 등수의 순서대로 나오도록 하고, rank()와 dense_rank()를 비교할 수 있도록
한 SQL로 작성하시오.

SQL> select emp_id, emp_name, salary,
       rank() over (order by salary desc) as c1,
       dense_rank() over (order by salary desc) as c2
from temp;

  2    3    4 
    EMP_ID EMP_NAME   SALARY  C1     C2
---------- ---------- ---------- ---------- ----------
  19970101 김길동      100000000   1      1
  19960101 홍길동 72000000   2      2
  19930331 정도령 70000000   3      3
  19930402 강감찬 64000000   4      4
  19950303 이순신 56000000   5      5
  19970201 박문수 50000000   6      6
  19966102 지문덕 45000000   7      7
  19970112 연흥부 45000000   7      7
  19960212 배뱅이 39000000   9      8
  19960303 설까치 35000000  10      9

10 개의 행이 선택되었습니다.


※ 출처 : 전문가로 가는 지름 길 오라클 실습(이채남 저)

'Oracle > SQL' 카테고리의 다른 글

SQL 교육 커리큘럼  (0) 2018.03.27
테이블 및 컬럼의 COMMENT 확인  (0) 2016.11.18
view에 dml이 될까?  (0) 2011.07.11
현재 SCN 구하기  (0) 2010.10.01
히든 파라미터 확인 SQL  (0) 2010.09.01
Posted by 자수성가한 부자