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

row number () over(partition by order by) as COL1

Queen Julia 2024. 8. 19. 00:17

`ROW_NUMBER()` 함수는 SQL에서 순번을 매기는 데 사용되는 윈도우 함수입니다. `OVER` 절과 함께 사용하여 특정 기준에 따라 행에 일련번호를 부여할 수 있습니다.

### 구문 설명

```sql
ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2) AS COL1
```

#### 각 구성 요소의 역할:

- **`ROW_NUMBER()`**: 데이터의 각 행에 대해 고유한 번호를 할당합니다. 번호는 1부터 시작합니다.
  
- **`OVER`**: 윈도우 함수(`ROW_NUMBER` 등)와 함께 사용하여 데이터를 어떻게 분할(`PARTITION BY`)하고, 어떻게 정렬(`ORDER BY`)할지 지정합니다.

- **`PARTITION BY`**: 데이터를 특정 기준으로 그룹화합니다. `PARTITION BY` 절을 사용하면 각 그룹에 대해 별도의 순번이 매겨집니다. 예를 들어, `PARTITION BY department_id`라고 하면, 부서별로 행이 분할되고, 각 부서 내에서 순번이 매겨집니다.

- **`ORDER BY`**: 지정된 기준에 따라 행을 정렬하고 그 순서에 따라 순번을 매깁니다. 예를 들어, `ORDER BY salary DESC`라고 하면, 각 파티션 내에서 급여를 기준으로 내림차순 정렬하고, 그 순서에 따라 순번이 매겨집니다.

- **`AS COL1`**: 계산된 결과를 `COL1`이라는 열 이름으로 지정합니다.

### 예시

다음은 `ROW_NUMBER()`를 사용하는 예제입니다:

```sql
SELECT
    employee_id,
    department_id,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS COL1
FROM employees;
```

#### 이 쿼리의 동작:

- **`PARTITION BY department_id`**: `department_id`를 기준으로 데이터를 그룹화합니다. 즉, 부서별로 데이터가 나누어집니다.
- **`ORDER BY salary DESC`**: 각 부서 내에서 `salary`를 기준으로 내림차순으로 정렬합니다.
- **`ROW_NUMBER()`**: 각 부서 내에서 급여 순으로 1부터 시작하는 순번을 매깁니다.
- **`AS COL1`**: 이 순번을 `COL1`이라는 이름으로 반환합니다.

### 결과 예시

`employees` 테이블에 다음과 같은 데이터가 있다고 가정해보겠습니다:

| employee_id | department_id | salary |
|-------------|---------------|--------|
| 1           | 10            | 5000   |
| 2           | 10            | 6000   |
| 3           | 20            | 7000   |
| 4           | 20            | 4000   |

위의 쿼리를 실행하면 결과는 다음과 같습니다:

| employee_id | department_id | salary | COL1 |
|-------------|---------------|--------|------|
| 2           | 10            | 6000   | 1    |
| 1           | 10            | 5000   | 2    |
| 3           | 20            | 7000   | 1    |
| 4           | 20            | 4000   | 2    |

### 요약

- `ROW_NUMBER()`는 각 행에 대해 고유한 번호를 매기는 함수입니다.
- `PARTITION BY`는 데이터를 그룹화하여, 각 그룹 내에서 개별적으로 번호를 매기도록 합니다.
- `ORDER BY`는 각 그룹 내에서 행의 순서를 지정합니다.
- 이 조합은 데이터 그룹화 및 정렬 기준에 따라 고유한 순번을 매기고 싶을 때 유용합니다.