ORACLE RANK
RANK 함수는 일반적으로 매출, 영업, 성적 등의 순위를 표현할 때 사용됩니다.
어렵지 않지만 자주 사용되는 함수이니 사용법을 잘 숙지해두시면
평소 업무도 뚝딱 해결할 수 있으니 같이 공유해요^^
ORACLE 에서 제공하는 RANK 문법은 아래와 같습니다.
RANK 문법
RANK 함수 사용하는 방법은
아래의 EMP 테이블을 예제로 설명드리겠습니다.
잠깐!
간단한 질문과 결과를 올려놓았으니
잠시 생각하시고 SQL 문을 확인하시면 조금 더 도움이 되실꺼에요!
EMPNO |
ENAME |
JOB |
MGR |
HIREDATE |
SAL |
COMM |
DEPTNO |
7369 |
SMITH |
CLERK |
7902 |
1980-12-17 |
800 |
(null) |
20 |
7499 |
ALLEN |
SALESMAN |
7698 |
1981-02-20 |
1600 |
300 |
30 |
7521 |
WARD |
SALESMAN |
7698 |
1981-02-22 |
1250 |
500 |
30 |
7566 |
JONES |
MANAGER |
7839 |
1981-04-02 |
2975 |
(null) |
20 |
7654 |
MARTIN |
SALESMAN |
7698 |
1981-09-28 |
1250 |
1400 |
30 |
7698 |
BLAKE |
MANAGER |
7839 |
1981-05-01 |
2850 |
(null) |
30 |
7782 |
CLARK |
MANAGER |
7839 |
1981-06-09 |
2450 |
(null) |
10 |
7788 |
SCOTT |
ANALYST |
7566 |
1987-04-19 |
3000 |
(null) |
20 |
7839 |
KING |
PRESIDENT |
(null) |
1981-11-17 |
5000 |
(null) |
10 |
7844 |
TURNER |
SALESMAN |
7698 |
1981-09-08 |
1500 |
0 |
30 |
7876 |
ADAMS |
CLERK |
7788 |
1987-05-23 |
1100 |
(null) |
20 |
7900 |
JAMES |
CLERK |
7698 |
1981-12-03 |
950 |
(null) |
30 |
7902 |
FORD |
ANALYST |
7566 |
1981-12-03 |
3000 |
(null) |
20 |
7934 |
MILLER |
CLERK |
7782 |
1982-01-23 |
1300 |
(null) |
10 |
자 그럼 기본적인 사용법부터 확인해볼까요?
RANK()
1. 직원의 급여가 높은 순서대로 순위를 아래와 같이 조회해보세요.
( 항목 추출 : EMPNO, ENAME, SAL, 순위 )
< 결과 >
EMPNO |
ENAME |
SAL |
RK |
7839 |
KING |
5000 |
1 |
7902 |
FORD |
3000 |
2 |
7788 |
SCOTT |
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 |
DENSE_RANK()
2,3번째 row를 보면 FORD 와 SCOTT 은 같은급여를 받고 있습니다.
다음 순위의 급여를 받는 JONES의 순위가 3위가 아니라 4위가 되었습니다.
3위로 출력하고 싶은 경우는 어떻게 할까요?
2. 순위의 공백이 없도록 DENSE_RANK 를 사용하여 조회해보세요.
< 결과 >
EMPNO |
ENAME |
SAL |
RK |
7839 |
KING |
5000 |
1 |
7902 |
FORD |
3000 |
2 |
7788 |
SCOTT |
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 |
ROW_NUMBER()
동일한 급여에도 순위가 나뉘도록 조회해보겠습니다.
3. 동일한 순위를 인정하지 않도록 조회해보세요.
< 결과 >
EMPNO |
ENAME |
SAL |
RK |
7839 |
KING |
5000 |
1 |
7902 |
FORD |
3000 |
2 |
7788 |
SCOTT |
3000 |
3 |
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 |
11 |
7876 |
ADAMS |
1100 |
12 |
7900 |
JAMES |
950 |
13 |
7369 |
SMITH |
800 |
14 |
자, 위와 같이 조회하면 어떤 기준으로 2등과 3등이 나뉜지 알 수 없습니다.
"2등과 3등의 차이가 뭐야?" 라고 물어본다면 대답할 수 없으니
우리는 명시적으로 그 차이를 지정하는 기준을 만들어볼께요!
4. 급여는 같지만 입사일이 빠른경우를 상위순위로 배치하도록 조회해보세요.
순위를 산정하는 방식이 2가지 인것을 생각해보면 쉬워요~ ( 급여, 입사일 )
< 결과 >
EMPNO |
ENAME |
SAL |
HIREDATE |
RK |
7839 |
KING |
5000 |
1981-11-17 |
1 |
7902 |
FORD |
3000 |
1981-12-03 |
2 |
7788 |
SCOTT |
3000 |
1987-04-19 |
3 |
7566 |
JONES |
2975 |
1981-04-02 |
4 |
7698 |
BLAKE |
2850 |
1981-05-01 |
5 |
7782 |
CLARK |
2450 |
1981-06-09 |
6 |
7499 |
ALLEN |
1600 |
1981-02-20 |
7 |
7844 |
TURNER |
1500 |
1981-09-08 |
8 |
7934 |
MILLER |
1300 |
1982-01-23 |
9 |
7521 |
WARD |
1250 |
1981-02-22 |
10 |
7654 |
MARTIN |
1250 |
1981-09-28 |
11 |
7876 |
ADAMS |
1100 |
1987-05-23 |
12 |
7900 |
JAMES |
950 |
1981-12-03 |
13 |
7369 |
SMITH |
800 |
1980-12-17 |
14 |
여기까지 보셨다면 기본적인 RANK 의 사용법을 알게 되었습니다.
아래부터는 RANK 함수를 응용한 내용을 공유해보겠습니다.
RANK 응용1
- 급여가 가장 높은 사람이 누구인지 1명만 조회하세요.
< 결과 >
ENAME |
KING |
위와 같은 결과지만 좀 더 쉽게 조회 할 수 있는 방법도 있습니다.
바로 오라클의 KEEP / FIRST / LAST 문법을 사용하는것인데 MAX 값을 조회 후
다른 컬럼의 값을 바로 조회할 수 있습니다!
조금 더 자세한 내용을 알고 싶다면 FIRST, LAST, KEEP 포스트를 확인해주세요~ ( 바로확인하기 )
RANK 응용2
- 총급여가 많은 부서별 순위를 조회하세요.
부서별로 급여의 순위는 단순하게 처리가 가능합니다.
부서로 GROUP BY 후 ORDER BY 에서 지정한 정렬컬럼을 SUM 처리하면 됩니다.
< 결과 >
DEPTNO |
DNAME |
SAL |
RK |
20 |
RESEARCH |
10875 |
1 |
30 |
SALES |
9400 |
2 |
10 |
ACCOUNTING |
8750 |
3 |
RANK 응용3
- 부서별로 급여를 가장 많이 받는 사람을 조회하세요.
RANK 함수를 사용할 때 PARTITION BY 를 사용하면 해당 컬럼을 파티션으로 묶어 순위를 부여할 수 있습니다.
< 결과 >
DEPTNO |
DNAME |
EMPNO |
ENAME |
SAL |
RK |
10 |
ACCOUNTING |
7839 |
KING |
5000 |
1 |
10 |
ACCOUNTING |
7782 |
CLARK |
2450 |
2 |
10 |
ACCOUNTING |
7934 |
MILLER |
1300 |
3 |
20 |
RESEARCH |
7902 |
FORD |
3000 |
1 |
20 |
RESEARCH |
7788 |
SCOTT |
3000 |
1 |
20 |
RESEARCH |
7566 |
JONES |
2975 |
3 |
20 |
RESEARCH |
7876 |
ADAMS |
1100 |
4 |
20 |
RESEARCH |
7369 |
SMITH |
800 |
5 |
30 |
SALES |
7698 |
BLAKE |
2850 |
1 |
30 |
SALES |
7499 |
ALLEN |
1600 |
2 |
30 |
SALES |
7844 |
TURNER |
1500 |
3 |
30 |
SALES |
7521 |
WARD |
1250 |
4 |
30 |
SALES |
7654 |
MARTIN |
1250 |
4 |
30 |
SALES |
7900 |
JAMES |
950 |
6 |
이상으로 오라클 RANK 함수에 대해 알아보았습니다.
도움이 되셨거나 추가질문이 있다면 댓글 남겨주세요~^^
'IT > Oracle' 카테고리의 다른 글
오라클 최근 생성된 테이블, 뷰 확인 (0) | 2017.11.09 |
---|---|
오라클 자주발생하는 에러 및 해결 (0) | 2017.09.21 |
오라클 KEEP , FIRST , LAST 예제로 확인하는 사용법 (3) | 2017.09.04 |
오라클 파티션 테이블 샘플(생성 수정 삭제) 및 주의사항 (4) | 2017.07.25 |
오라클 MERGE 간단한 예제로 한번에 INSERT, UPDATE 처리 (5) | 2017.07.24 |