`DENSE_RANK()`, `RANK()`, 그리고 `ROW_NUMBER()`는 모두 SQL의 윈도우 함수로, 데이터 집합에서 행의 순위를 계산하는 데 사용됩니다. 각 함수는 순위를 부여하는 방식이 다릅니다.
### 차이점
1. **`ROW_NUMBER()`**
- 각 행에 대해 고유한 순위를 부여합니다.
- 동일한 값이 있는 경우에도 각 행에는 고유한 순위가 부여됩니다.
- 순위가 연속적이지 않을 수 있습니다.
2. **`RANK()`**
- 동일한 값이 있는 행들에 대해 동일한 순위를 부여합니다.
- 동일한 순위를 부여받은 행들의 순위 뒤에는 건너뛴 순위가 부여됩니다.
- 예를 들어, 두 행이 순위 2를 가질 경우, 다음 행은 순위 4가 됩니다.
3. **`DENSE_RANK()`**
- 동일한 값이 있는 행들에 대해 동일한 순위를 부여합니다.
- 순위가 연속적으로 부여되며, 건너뛴 순위가 없습니다.
- 예를 들어, 두 행이 순위 2를 가질 경우, 다음 행은 순위 3이 됩니다.
### 예제
가정: `sales` 테이블에 판매 금액 데이터가 저장되어 있습니다.
| sales_date | sales_amount |
|------------|--------------|
| 2024-01-01 | 1000 |
| 2024-01-02 | 1200 |
| 2024-01-03 | 1000 |
| 2024-01-04 | 1300 |
#### 1. `ROW_NUMBER()`
```sql
SELECT
sales_date,
sales_amount,
ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS row_num
FROM sales;
```
**결과**:
| sales_date | sales_amount | row_num |
|------------|--------------|---------|
| 2024-01-04 | 1300 | 1 |
| 2024-01-02 | 1200 | 2 |
| 2024-01-01 | 1000 | 3 |
| 2024-01-03 | 1000 | 4 |
- `ROW_NUMBER()`는 모든 행에 대해 고유한 순위를 부여합니다.
#### 2. `RANK()`
```sql
SELECT
sales_date,
sales_amount,
RANK() OVER (ORDER BY sales_amount DESC) AS rank
FROM sales;
```
**결과**:
| sales_date | sales_amount | rank |
|------------|--------------|------|
| 2024-01-04 | 1300 | 1 |
| 2024-01-02 | 1200 | 2 |
| 2024-01-01 | 1000 | 3 |
| 2024-01-03 | 1000 | 3 |
- `RANK()`는 동일한 `sales_amount`에 대해 동일한 순위를 부여하고, 다음 순위는 건너뜁니다.
#### 3. `DENSE_RANK()`
```sql
SELECT
sales_date,
sales_amount,
DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS dense_rank
FROM sales;
```
**결과**:
| sales_date | sales_amount | dense_rank |
|------------|--------------|------------|
| 2024-01-04 | 1300 | 1 |
| 2024-01-02 | 1200 | 2 |
| 2024-01-01 | 1000 | 3 |
| 2024-01-03 | 1000 | 3 |
- `DENSE_RANK()`는 동일한 `sales_amount`에 대해 동일한 순위를 부여하고, 순위는 연속적으로 부여됩니다.
### 요약
- **`ROW_NUMBER()`**: 모든 행에 대해 고유한 순위를 부여합니다. 동일한 값이 있는 경우에도 순위는 고유합니다.
- **`RANK()`**: 동일한 값이 있는 행들에 대해 동일한 순위를 부여하며, 다음 순위는 건너뛰어 부여됩니다.
- **`DENSE_RANK()`**: 동일한 값이 있는 행들에 대해 동일한 순위를 부여하며, 순위는 연속적으로 부여됩니다.
이러한 함수들은 데이터 분석 및 보고서 작성 시 각 행의 상대적 위치를 이해하는 데 유용합니다.
'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글
drop schema employee restrict (0) | 2024.08.18 |
---|---|
percent_rank() (0) | 2024.08.18 |
오라클 데이터베이스 (0) | 2024.08.18 |
각각의 트랙잭션이 영향 주는 칼럼이 같을 때 값이 어떻게 되니 (0) | 2024.08.18 |
이커머스, 카탈로그, 라벨링, 머신러닝 (0) | 2024.05.22 |