`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에서 데이터를 더욱 유연하고 강력하게 분석할 수 있습니다.
'Data Analysis 데이터 분석 > 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 |