`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 |