그룹 내 순위를 매기는 함수에는
RANK, DENSE_RANK, ROW_NUMBER가 있다.
각각 특징을 비교하여 어떤 경우에 쓰이는 지 알아보았다.
- ROW_NUMBER()
SELECT
employee_id,
salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num
FROM
employees;
이 예시에서는 각 부서별로 사원을 연봉에 따라 순위를 매기는 경우이다.
employees 테이블에서 각 사원의 연봉을 내림차순으로 순위를 매긴다. PARTITION BY 절은 부서별로 분할하여 순위를 매기고, ORDER BY 절은 연봉을 기준으로 순위를 부여한다.
- RANK()
SELECT
student_id,
exam_score,
RANK() OVER (ORDER BY exam_score DESC) AS rank
FROM
exam_scores;
이 예시에서는 경쟁자들의 시험 성적을 순위별로 나열하는 경우이다.
exam_scores 테이블에서 각 학생의 시험 점수를 내림차순으로 순위를 매긴다. ORDER BY 절은 시험 점수를 기준으로 순위를 부여한다.
- DENSE_RANK()
SELECT
product_id,
sales_amount,
DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS dense_rank
FROM
product_sales;
이 예시에서는 제품 판매량을 기준으로 순위를 매기는 경우이다.
product_sales 테이블에서 각 제품의 판매량을 내림차순으로 순위를 매긴다.
중복된 값이 있어도 중간 순위를 건너뛰지 않고 연속된 순위를 할당한다.
같은 데이터를 각 함수를 사용하여 순위를 매긴다면 다음과 같이 나온다.
값 | ROW_NUMBER() | RANK() | DENSE_RANK() |
100 | 1 | 1 | 1 |
200 | 2 | 2 | 2 |
300 | 3 | 3 | 3 |
300 | 4 | 3 | 3 |
400 | 5 | 5 | 4 |
ROW_NUMBER()는 각 행마다 고유한 번호를 할당함.
RANK()는 동일한 값인 경우에도 동일한 순위를 부여하며, DENSE_RANK()는 중복된 값이 있더라도 연속된 순위를 할당한다.
'데이터베이스 > oracle' 카테고리의 다른 글
[함수] 1 일 1 함수 : ROLLUP의 쓰임 (0) | 2024.11.27 |
---|---|
토드(Toad)에서 다른 스키마의 테이블로 데이터 복사하기 (0) | 2024.03.25 |
TRANSLATE 함수로 정규식같은 효과 내기 (0) | 2023.09.05 |
인덱스란? (1) | 2023.08.29 |