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

그럼 rownum은 동일한 값으로 순위 매길 경우엔?

Queen Julia 2024. 8. 18. 17:00

`ROWNUM`은 Oracle SQL에서 행 번호를 부여하는 데 사용되며, 순서가 명확히 정의되지 않은 상태에서 번호가 부여됩니다. `ROWNUM`의 주요 특징은 쿼리 결과의 순서와 상관없이 각 행에 대해 순차적으로 번호를 매긴다는 점입니다.

### `ROWNUM`의 동작 방식

1. **순서 지정 없음**: `ROWNUM`은 쿼리 결과가 정렬되기 전에 적용됩니다. 따라서 동일한 값이 있는 경우, 번호는 정렬된 순서에 관계없이 단순히 순서대로 부여됩니다.

2. **정렬된 결과**: `ROWNUM`을 사용하여 정렬된 결과에서 특정 행을 선택하거나 필터링하려면 서브쿼리와 함께 사용하는 것이 일반적입니다.

### 예제와 설명

#### 예제 테이블

다음과 같은 `employees` 테이블이 있다고 가정합니다:

| employee_name | salary |
|---------------|--------|
| Alice         | 3000   |
| Bob           | 3000   |
| Charlie       | 2500   |
| David         | 2000   |

#### `ROWNUM` 사용

아래 쿼리는 단순히 `ROWNUM`을 사용하여 각 행에 번호를 매깁니다:

```sql
SELECT ROWNUM, employee_name, salary
FROM employees;
```

이 쿼리는 기본적으로 결과를 정렬하지 않으므로, 반환되는 순서가 `ROWNUM` 값에 영향을 미칩니다.

#### 정렬된 결과에서 `ROWNUM` 사용

동일한 `salary` 값을 가진 직원들이 있는 경우, 쿼리를 정렬한 후 `ROWNUM`을 적용하는 예제:

```sql
SELECT ROWNUM, employee_name, salary
FROM (
    SELECT employee_name, salary
    FROM employees
    ORDER BY salary DESC
);
```

이 경우, `salary`에 따라 정렬된 결과에서 `ROWNUM`이 부여됩니다. `salary`가 동일한 직원들이 있더라도, 정렬된 순서에 따라 번호가 부여됩니다. 그러나 동일한 `salary` 값을 가진 직원들 간에 `ROWNUM` 값은 차이가 나지 않으며, 순서에 따라서만 다릅니다.

### 동일한 값으로 순위 매기기

만약 동일한 값들(예: 동일한 `salary` 값)이 있다면, `ROWNUM`은 이 값들 사이의 순서에 의존하지 않습니다. 결과적으로, 동일한 값들 사이의 `ROWNUM`은 순서의 영향을 받아 다를 수 있습니다.

**예시**: `salary`가 3000인 직원들이 두 명 있는데, 이 직원들이 먼저 나오는지, 나중에 나오는지에 따라 `ROWNUM`이 달라질 수 있습니다.

**예제 결과**:

| ROWNUM | employee_name | salary |
|--------|---------------|--------|
| 1      | Alice         | 3000   |
| 2      | Bob           | 3000   |
| 3      | Charlie       | 2500   |
| 4      | David         | 2000   |

위 예제에서는 `salary`가 같은 두 직원(Alice와 Bob) 사이에 어떤 직원이 먼저 나오느냐에 따라 `ROWNUM`이 달라질 수 있습니다.

### 결론

- `ROWNUM`은 정렬되지 않은 상태에서 각 행에 번호를 매기며, 동일한 값을 가진 행들 사이에서는 순서에 따라 번호가 부여됩니다.
- 정렬 후 `ROWNUM`을 사용하려면 서브쿼리와 함께 사용하는 것이 일반적입니다. `ROWNUM`은 항상 고유한 순서 번호를 제공하며, 동일한 값을 가진 행들 사이에서의 순서는 정렬 순서에 따라 달라질 수 있습니다.