오라클 데이터베이스에서는 데이터를 특정 기준에 따라 순위를 매길 때 순위 함수(Ranking Functions)를 사용합니다. 이러한 함수들은 분석 함수(Analytic Functions)의 일부로, 데이터를 그룹화하거나 정렬된 결과에 기반한 다양한 순위를 제공합니다. 🏆
1. 순위 함수란?
순위 함수는 쿼리 결과에 대해 특정 기준으로 데이터를 정렬하고 순위를 매기는 데 사용됩니다. 오라클에서 제공하는 대표적인 순위 함수는 다음과 같습니다:
- RANK(): 동일한 값에 동일 순위를 부여하며, 순위 간 간격이 발생합니다.
- DENSE_RANK(): 동일한 값에 동일 순위를 부여하지만, 순위 간 간격이 발생하지 않습니다.
- 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;
'IT 개발 라이프 > DB' 카테고리의 다른 글
데이터베이스 트랜잭션(Transaction) (0) | 2024.12.31 |
---|---|
데이터베이스(DB) Lock (1) | 2024.12.26 |
오라클 계층형 쿼리 (Hierarchical Query) (0) | 2024.12.17 |
오라클 COALESCE 함수란? 💡 (0) | 2024.12.17 |
🔢 ORACLE(오라클) 숫자 함수 총정리 (0) | 2024.12.16 |