예제로 풀어보는 오라클 분석용 함수
●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 |