IT 개발 라이프/DB

오라클 순위 함수 (Ranking Functions)

10Biliion 2024. 12. 17. 08:33

 

 

 

 

 

 

 

오라클 데이터베이스에서는 데이터를 특정 기준에 따라 순위를 매길 때 순위 함수(Ranking Functions)를 사용합니다. 이러한 함수들은 분석 함수(Analytic Functions)의 일부로, 데이터를 그룹화하거나 정렬된 결과에 기반한 다양한 순위를 제공합니다. 🏆


1. 순위 함수란?

순위 함수는 쿼리 결과에 대해 특정 기준으로 데이터를 정렬하고 순위를 매기는 데 사용됩니다. 오라클에서 제공하는 대표적인 순위 함수는 다음과 같습니다:

  1. RANK(): 동일한 값에 동일 순위를 부여하며, 순위 간 간격이 발생합니다.
  2. DENSE_RANK(): 동일한 값에 동일 순위를 부여하지만, 순위 간 간격이 발생하지 않습니다.
  3. ROW_NUMBER(): 동일한 값이라도 고유한 순위를 부여합니다.

2. 순위 함수의 기본 구문

SELECT 컬럼1, 컬럼2,
       RANK() OVER (PARTITION BY 그룹컬럼 ORDER BY 정렬컬럼 ASC) AS RANK,
       DENSE_RANK() OVER (PARTITION BY 그룹컬럼 ORDER BY 정렬컬럼 ASC) AS DENSE_RANK,
       ROW_NUMBER() OVER (PARTITION BY 그룹컬럼 ORDER BY 정렬컬럼 ASC) AS ROW_NUMBER
FROM 테이블명;

주요 키워드 설명

  • OVER(): 순위 함수에 대한 기준을 정의합니다.
  • PARTITION BY: 데이터를 그룹화하여 그룹별로 순위를 매깁니다. 생략하면 전체 데이터에 대해 순위가 매겨집니다.
  • ORDER BY: 순위 계산의 기준이 되는 정렬 조건을 지정합니다.

3. 순위 함수 예제

예제 데이터

EMP 테이블의 데이터:

EMPNOENAMEDEPTNOSALARY

1 KING 10 5000
2 BLAKE 20 3000
3 CLARK 10 3000
4 JONES 20 2500
5 SCOTT 30 2800
6 FORD 30 2800
7 SMITH 20 2000

3.1 RANK() 함수

SELECT ENAME, DEPTNO, SALARY,
       RANK() OVER (PARTITION BY DEPTNO ORDER BY SALARY DESC) AS RANK
FROM EMP;

결과

ENAME DEPTNO SALARY RANK
KING 10 5000 1
CLARK 10 3000 2
BLAKE 20 3000 1
JONES 20 2500 2
SMITH 20 2000 3
SCOTT 30 2800 1
FORD 30 2800 1

동일 순위에 대해 다음 순위는 건너뜁니다.

3.2 DENSE_RANK() 함수

SELECT ENAME, DEPTNO, SALARY,
       DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SALARY DESC) AS DENSE_RANK
FROM EMP;

결과

ENAME DEPTNO SALARY DENSE_RANK
KING 10 5000 1
CLARK 10 3000 2
BLAKE 20 3000 1
JONES 20 2500 2
SMITH 20 2000 3
SCOTT 30 2800 1
FORD 30 2800 1

동일 순위에 대해 간격이 발생하지 않습니다.

3.3 ROW_NUMBER() 함수

SELECT ENAME, DEPTNO, SALARY,
       ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY SALARY DESC) AS ROW_NUMBER
FROM EMP;

결과

ENAME DEPTNO SALARY ROW_NUMBER
KING 10 5000 1
CLARK 10 3000 2
BLAKE 20 3000 1
JONES 20 2500 2
SMITH 20 2000 3
SCOTT 30 2800 1
FORD 30 2800 2

각 행에 고유한 순위를 부여합니다.


4. 활용

4.1 상위 N위 구하기

SELECT ENAME, SALARY
FROM (
    SELECT ENAME, SALARY,
           RANK() OVER (ORDER BY SALARY DESC) AS RANK
    FROM EMP
)
WHERE RANK <= 3;

4.2 그룹별 Top-N 구하기

SELECT ENAME, DEPTNO, SALARY
FROM (
    SELECT ENAME, DEPTNO, SALARY,
           ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY SALARY DESC) AS ROW_NUM
    FROM EMP
)
WHERE ROW_NUM = 1;