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

rows between unbounded preceding and current row

Queen Julia 2024. 8. 19. 00:17

sum 연봉 over partition by 부서id order by 사원 id rows between unbounded preceding and current row

이 쿼리는 윈도우 함수(`SUM`)를 사용하여, 각 사원의 연봉 합계를 부서별로 계산하면서, 특정 범위 내의 행들에 대한 합계를 구하는 예시입니다. 구문과 동작을 하나씩 살펴보겠습니다.

### 구문 설명

```sql
SUM(연봉) OVER (
    PARTITION BY 부서ID
    ORDER BY 사원ID
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
```

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

- **`SUM(연봉)`**: 연봉(`연봉` 열)의 합계를 계산하는 집계 함수입니다.

- **`OVER`**: 윈도우 함수(`SUM`, `ROW_NUMBER`, `AVG` 등)와 함께 사용되어, 이 함수가 어떻게 동작할지를 지정합니다.

- **`PARTITION BY 부서ID`**: 부서별로 데이터를 그룹화합니다. 즉, `부서ID`가 동일한 행들끼리 묶입니다. 이 묶음 내에서만 윈도우 함수가 적용됩니다.

- **`ORDER BY 사원ID`**: 각 부서 내에서 `사원ID`에 따라 데이터를 정렬합니다.

- **`ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`**:
  - **`ROWS`**: 윈도우 프레임을 행 단위로 정의합니다.
  - **`BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`**: 윈도우 프레임이 시작부터(`UNBOUNDED PRECEDING`) 현재 행(`CURRENT ROW`)까지의 범위 내에 있는 모든 행을 포함함을 의미합니다.

### 이 구문의 동작

이 구문은 다음과 같은 방식으로 동작합니다:

1. **부서별로 데이터 그룹화**: `PARTITION BY 부서ID`를 통해 데이터가 부서별로 분할됩니다.
2. **부서 내에서 사원ID로 정렬**: `ORDER BY 사원ID`에 따라 각 부서 내에서 사원들이 정렬됩니다.
3. **윈도우 프레임 내에서 연봉 합계 계산**: 현재 사원까지 포함하여 그 앞의 모든 행들의 연봉을 합산합니다.

### 예시 데이터

아래와 같은 데이터를 가진 `employees` 테이블이 있다고 가정해 봅시다:

| 사원ID | 부서ID | 연봉  |
|--------|--------|-------|
| 1      | 10     | 5000  |
| 2      | 10     | 6000  |
| 3      | 10     | 4000  |
| 4      | 20     | 7000  |
| 5      | 20     | 6000  |

### 결과 예시

위의 구문을 실행하면 각 사원에 대한 연봉 합계가 계산됩니다. 이 때의 결과는 다음과 같습니다:

| 사원ID | 부서ID | 연봉  | 연봉 합계 (누적) |
|--------|--------|-------|------------------|
| 1      | 10     | 5000  | 5000             |
| 2      | 10     | 6000  | 11000            |
| 3      | 10     | 4000  | 15000            |
| 4      | 20     | 7000  | 7000             |
| 5      | 20     | 6000  | 13000            |

- **사원ID 1**: 연봉은 5000이며, 그 전의 데이터가 없으므로 연봉 합계는 5000입니다.
- **사원ID 2**: 연봉은 6000이며, 사원ID 1의 연봉 5000과 합쳐져서 11000이 됩니다.
- **사원ID 3**: 연봉은 4000이며, 앞선 사원들의 연봉 합계(5000 + 6000)와 합쳐져서 15000이 됩니다.
- **사원ID 4**: 새로운 부서(부서ID 20)로 넘어가서, 이 부서 내에서 처음 사원이므로 연봉 합계는 7000입니다.
- **사원ID 5**: 부서ID 20에서 두 번째 사원이므로, 앞선 사원의 연봉과 합쳐져서 13000이 됩니다.

### 요약

- **`SUM(연봉)`**는 지정된 윈도우 프레임 내에서 연봉의 합계를 계산합니다.
- **`PARTITION BY 부서ID`**는 부서별로 데이터를 나누어 각 부서 내에서만 연봉 합계를 계산합니다.
- **`ORDER BY 사원ID`**는 각 부서 내에서 사원ID를 기준으로 순서를 정합니다.
- **`ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`**는 현재 행까지의 모든 이전 행들의 연봉을 합산합니다.

이 쿼리는 특정 그룹(부서) 내에서 누적 합계를 구하는 데 유용합니다.