SQL 통한 Database 관리

partition by

JBS 12 2024. 8. 19. 00:19

`PARTITION BY`는 SQL에서 데이터 집계, 분석 함수, 또는 순위 함수 등을 사용할 때 데이터를 논리적으로 그룹화하는 데 사용됩니다. 이는 데이터의 물리적 분할이 아닌 논리적 분할로, 각 파티션(그룹) 내에서 독립적으로 연산이 수행됩니다.

`PARTITION BY`는 `GROUP BY`와 비슷하게 보일 수 있지만, `GROUP BY`는 데이터를 그룹화하여 집계 결과를 반환하는 반면, `PARTITION BY`는 분석 함수와 함께 사용되어 각 파티션 내에서 개별적으로 계산된 결과를 반환하면서도 원래의 행을 유지합니다.

### `PARTITION BY`의 사용 예제

#### 1. `ROW_NUMBER()` 함수와 함께 사용

`ROW_NUMBER()` 함수는 각 파티션 내에서 각 행에 대한 순차적인 번호를 매깁니다.

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

#### 결과

이 쿼리는 각 부서(`department_id`)별로 직원들을 급여(`salary`) 내림차순으로 정렬하고, 그 순서에 따라 번호를 매깁니다.

| employee_id | department_id | salary | rank |
|-------------|---------------|--------|------|
| 101         | 10            | 9000   | 1    |
| 102         | 10            | 8500   | 2    |
| 103         | 20            | 9500   | 1    |
| 104         | 20            | 8800   | 2    |

#### 2. `SUM()` 함수와 함께 사용

`PARTITION BY`를 사용하여 각 파티션 내에서의 합계를 계산할 수 있습니다.

```sql
SELECT
    employee_id,
    department_id,
    salary,
    SUM(salary) OVER (PARTITION BY department_id) AS department_total_salary
FROM
    employees;
```

#### 결과

이 쿼리는 각 부서별로 급여의 합계를 계산하며, 그 결과를 각 행에 보여줍니다.

| employee_id | department_id | salary | department_total_salary |
|-------------|---------------|--------|-------------------------|
| 101         | 10            | 9000   | 17500                   |
| 102         | 10            | 8500   | 17500                   |
| 103         | 20            | 9500   | 18300                   |
| 104         | 20            | 8800   | 18300                   |

### `PARTITION BY`와 `GROUP BY` 비교

- **`GROUP BY`**: 행들을 그룹화하고, 그룹별로 하나의 집계 결과를 반환합니다. 그룹화된 결과만 반환되며, 원본 행은 사라집니다.
  
- **`PARTITION BY`**: 원본 행을 유지하면서, 그룹화된 데이터를 기반으로 분석 함수를 적용합니다. 이는 데이터 집계와는 다르며, 각 파티션 내에서 분석 함수가 적용됩니다.

### 요약

- **`PARTITION BY`**는 데이터를 논리적으로 그룹화하여 분석 함수나 집계 함수가 각 그룹(파티션) 내에서 독립적으로 작동하도록 합니다.
- `PARTITION BY`는 원본 데이터를 유지하면서 각 그룹 내에서의 계산 결과를 제공합니다.
- 주로 순위 함수(`ROW_NUMBER`, `RANK` 등), 집계 함수(`SUM`, `AVG` 등)와 함께 사용됩니다.

이러한 기능을 통해 SQL에서 데이터를 더욱 유연하고 강력하게 분석할 수 있습니다.

'SQL 통한 Database 관리' 카테고리의 다른 글

start with, connect by prior c, order siblings by  (0) 2024.08.20
grouping sets () rollup()  (0) 2024.08.19
connect by prior의 부모 자식 아는 법  (0) 2024.08.19
join, cross join, natural join  (0) 2024.08.19
distinct a||b  (0) 2024.08.19