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

rownum, row_number 동일 순위 있는 경우

Queen Julia 2024. 8. 18. 17:00

`ROWNUM`과 `ROW_NUMBER()`는 모두 SQL에서 행 번호를 부여하지만, 동일 순위(중복 순위) 처리가 다릅니다.

### 1. `ROWNUM`

- **기본 동작**: `ROWNUM`은 Oracle SQL에서 각 행에 대해 고유한 순번을 부여하며, 쿼리 결과가 반환되는 순서에 따라 번호가 매겨집니다.
- **중복 처리**: `ROWNUM`은 순위를 매기기 전에 결과 집합이 정렬되지 않기 때문에, 정렬된 순위나 동일한 순위의 처리에 대한 내장된 메커니즘이 없습니다. 결과 집합에서 동일한 값이 있을 때, 중복된 `ROWNUM`이 발생할 수 없습니다.

### 2. `ROW_NUMBER()`

- **기본 동작**: `ROW_NUMBER()`는 SQL 표준 윈도우 함수로, `ORDER BY` 절에 지정된 순서에 따라 각 행에 고유한 순번을 부여합니다.
- **중복 처리**: `ROW_NUMBER()`는 각 행에 고유한 번호를 부여하기 때문에 동일한 값을 가진 행이라도 순위가 서로 다를 수 있습니다. 이 함수는 항상 고유한 순번을 보장합니다.

### 예제

#### `ROWNUM` 사용 예제

아래 예제에서는 동일한 `salary` 값을 가진 직원들이 있습니다:

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

- 이 쿼리에서 `ROWNUM`은 정렬된 결과의 순서에 따라 매겨지므로, 동일한 `salary`를 가진 직원들이 `ROWNUM`이 동일하지 않습니다.

#### `ROW_NUMBER()` 사용 예제

다음 쿼리는 `salary` 기준으로 정렬하여 각 행에 번호를 부여합니다:

```sql
SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn, employee_name, salary
FROM employees;
```

- 이 쿼리에서는 동일한 `salary`를 가진 직원들이라도, `ROW_NUMBER()`는 고유한 순번을 부여합니다. 즉, 동일한 `salary`를 가진 직원들이 순위에서 차별화되며, 동일한 값이 있어도 각 행에 고유한 순번이 매겨집니다.

### 결론

- **`ROWNUM`**: 순위 매기기 전에 데이터 정렬이 필요하며, 정렬이 반영되지 않으면 동일한 순위의 처리가 불가능합니다.
- **`ROW_NUMBER()`**: 데이터 정렬 후 고유한 순위를 부여하며, 동일한 값이라도 고유한 번호를 부여합니다.

`ROW_NUMBER()`는 동일한 값이 있는 경우에도 순서를 매기는 데 유용하고, 다양한 정렬 및 집계 시나리오에서 정밀한 행 번호 부여가 필요할 때 적합합니다.

'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글

그럼 rownum은 동일한 값으로 순위 매길 경우엔?  (0) 2024.08.18
rownum, row_number  (0) 2024.08.18
lag()  (0) 2024.08.18
with grant option  (0) 2024.08.18
grant()  (0) 2024.08.18