본문 바로가기
ORACLE/SQL

[Oracle] ROW_NUMBER, RANK, DENSE_RANK 함수 순위 매기기 :: 마이자몽

by 마이자몽 🌻♚ 2020. 3. 29.
사원들의 급여를 많이 받는 순서대로 순위를 출력하시오.

ORACLE SCOTT 계정의 EMPLOYEES 테이블을 이용해서 출력한 결과입니다.

순서를 매기는 방법에는 여러가지 방법이 있습니다. 분석함수를 사용하지 않는다면 아래처럼 구할것 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
    EMPNO
    ,ENAME 
    ,SAL
    ,DEPTNO
    ,ROWNUM AS RNK
FROM
  (
    SELECT 
      * 
    FROM 
      EMP 
    ORDER BY SAL DESC
  );

SELECT 절은 ORDER BY 이전에 실행되기 때문에 SUBQUERY를 이용해서 순위를 매길수 있습니다. 전체 순위중 일부를 출력하기 위해서는 TOP-N쿼리나 ROW LIMIT CLAUSE를 사용해서 출력이 가능합니다. 자세한 내용은 아래 링크를 참조!

 

[Oracle] 오라클 페이징 쿼리 쉽게 만들기 Row Limiting Clause 사용 :: 마이자몽

오라클 페이징 오라클 데이터베이스 페이징 쿼리는 어떻게 작성할까요? 포털 사이트에서 검색을 했을 때, 게시판 형태의 웹사이트에서 결과를 볼때, 한번에 모든 결과를 볼 수 없기 때문에 페이징 처리를 하여 화..

myjamong.tistory.com

 

그럼 분석함수를 이용하면 어떨까요?

1
2
3
4
5
6
7
SELECT
    EMPNO
    ,ENAME
    ,SAL
    ,DEPTNO
    ,ROW_NUMBER() OVER(ORDER BY SAL DESC) AS RNK
FROM EMP;
 

ROW_NUMBER함수를 사용해서 쉽게 구할 수 있습니다.

 

분석함수에는 순위를 매기기 위해 사용되는 함수가 3가지 있습니다. ROW_NUMBER(), RANK(), DENSE_RANK()  세개의 함수를 비교해서 어떤 차이가 있는지 알아봅시다.

 

 

ROW_NUMBER, RANK, DENSE_RANK 비교

위의 예제에서 ROW_NUMBER를 사용했을때, 중복에 대한 순위 처리는 없었습니다. 그냥 순서대로만 나열했습니다. 그런데 동일 값에 대해서 같은 순서로 출력하고 싶을때는 어떻게 해야할까요? 3가지 함수를 동시에 사용해서 비교해보겠습니다.

 

 

1
2
3
4
5
6
7
8
9
SELECT
    EMPNO
    ,ENAME
    ,SAL
    ,DEPTNO
    ,ROW_NUMBER() OVER(ORDER BY SAL DESC) AS RN_RANK
    ,RANK() OVER(ORDER BY SAL DESC) AS RANK
    ,DENSE_RANK() OVER(ORDER BY SAL DESC) AS D_RANK
FROM EMP;
 

9, 10 ,11번 행을 확인해보면 각각 결과가 다른 것을 확인 할 수 있습니다.

 

 

 

ROW_NUMBER 함수

ROW_NUMBER 함수는 동일 값에 상관없이 순차적인 번호로 순위를 부여합니다.

 

RANK 함수

RANK 함수는 동일값에 대해서 같은 순위를 부여하고 다음 순위는 누적 순위로 출력합니다.

 

DENSE_RANK 함수

 DENSE_RANK 함수는 동일값에 대해서 같은 순위를 부여하고 다음 순위는 누적 시키지 않고 그대로 순차를 지킵니다.

 

 

 

PARTITION ORDER BY

1
2
3
4
5
6
7
SELECT
    EMPNO
    ,ENAME
    ,SAL
    ,DEPTNO
    ,RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS RNK
FROM EMP;
 

분석함수를 사용하면, 각 그룹별로 순위를 매기는 작업을 간단한 쿼리로 출력이 가능합니다.

 

[Oracle] OVER ... PARTITION BY 분석절 ANALYTIC FUNCTION :: 마이자몽

사원 정보를 입력하는데, 전체 급여 평균값과 함께 출력하시오. ORACLE SCOTT 계정 EMP 테이블로 출력된 결과입니다. 위 문제를 풀기 위해 어떻게 쿼리를 작성하실건가요? 1 2 3 4 5 6 7 8 SELECT DEPTNO ,EMPNO..

myjamong.tistory.com

 

 

RANK 예측 WITHIN GROUP

1
2
3
4
SELECT
    RANK(2975) WITHIN GROUP (ORDER BY SAL DESC) AS RNK
    ,DENSE_RANK(2975) WITHIN GROUP (ORDER BY SAL DESC) AS D_RNK
FROM EMP;
 

RANK와 DENSE_RANK함수에 인자를 넣어주면 해당 값이 범위에 있다면 몇등인가?를 확인할 수 있습니다.

 

태그

댓글0