Data Analysis 데이터 분석/SQL 통한 Database 관리

dense_rank() , rank, row number 동일한 값 있을 경우 예시

Queen Julia 2024. 8. 18. 16:56

`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()`**: 동일한 값이 있는 행들에 대해 동일한 순위를 부여하며, 순위는 연속적으로 부여됩니다.

이러한 함수들은 데이터 분석 및 보고서 작성 시 각 행의 상대적 위치를 이해하는 데 유용합니다.