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

max(연봉) over (order by 연봉 desc rows current row) as col3

Queen Julia 2024. 8. 19. 00:16

`MAX(연봉) OVER (ORDER BY 연봉 DESC ROWS CURRENT ROW)`은 SQL에서 윈도우 함수(`MAX`)를 사용하여 특정 범위 내에서 최대 연봉을 계산하는 구문입니다. 하지만 이 구문에는 논리적인 오류가 있습니다. `ROWS CURRENT ROW`는 현재 행만을 참조하는 구문인데, `MAX` 함수는 이 경우 아무 의미가 없게 됩니다. 대신 `RANGE` 또는 `ROWS BETWEEN` 절을 사용하는 것이 적절합니다.

그러나 요청하신 구문을 예시와 함께 설명해 보겠습니다.

### 구문 분석

```sql
MAX(연봉) OVER (ORDER BY 연봉 DESC ROWS CURRENT ROW) AS col3
```

#### 각 부분의 의미:

- **`MAX(연봉)`**: 윈도우 함수로, 특정 범위 내에서 `연봉` 컬럼의 최대값을 계산합니다.

- **`OVER`**: 윈도우 함수와 함께 사용되며, 데이터의 정렬 방식과 윈도우 프레임을 정의합니다.

- **`ORDER BY 연봉 DESC`**: 데이터를 연봉을 기준으로 내림차순으로 정렬합니다. 즉, 연봉이 높은 순서대로 정렬됩니다.

- **`ROWS CURRENT ROW`**: 현재 행만을 참조하는 윈도우 프레임을 설정합니다. 따라서 `MAX` 함수는 현재 행의 `연봉` 값만 참조하게 됩니다.

- **`AS col3`**: 결과 컬럼 이름을 `col3`로 지정합니다.

### 논리적 해석

- 이 구문은 연봉이 내림차순으로 정렬된 상태에서, 현재 행의 `연봉` 값을 `MAX` 함수로 반환합니다.
- **결과**는 항상 현재 행의 `연봉` 값 자체가 됩니다. 왜냐하면 `ROWS CURRENT ROW`는 현재 행만을 참조하기 때문에, `MAX` 함수가 단일 값에서 최대값을 찾게 되어 결국 그 값 자체를 반환합니다.

### 적절한 사용 예시

일반적으로 `MAX` 윈도우 함수를 사용할 때는 특정 범위 내에서 최대값을 찾기 위해 `ROWS BETWEEN`을 사용합니다. 예를 들어, 누적 최대값을 계산하고 싶다면:

```sql
MAX(연봉) OVER (ORDER BY 연봉 DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS col3
```

#### 이 구문의 동작:

- **`ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`**: 현재 행까지의 모든 이전 행들을 포함하여 최대 연봉을 계산합니다.
- 이 경우, 현재 행까지의 모든 행들 중에서 가장 높은 연봉을 `col3`로 반환합니다.

### 예시 데이터와 결과

예를 들어, 다음과 같은 데이터가 있다고 가정해 봅시다:

| 사원ID | 연봉  |
|--------|-------|
| 1      | 7000  |
| 2      | 5000  |
| 3      | 4000  |
| 4      | 3000  |

위와 같은 데이터에서 `MAX(연봉) OVER (ORDER BY 연봉 DESC ROWS CURRENT ROW)`를 사용하면 결과는 다음과 같습니다:

| 사원ID | 연봉  | col3 |
|--------|-------|------|
| 1      | 7000  | 7000 |
| 2      | 5000  | 5000 |
| 3      | 4000  | 4000 |
| 4      | 3000  | 3000 |

각 행에서 `col3`는 그 행의 `연봉` 값과 동일합니다.

### 요약

- **`MAX(연봉)`** 함수는 기본적으로 윈도우 프레임 내에서 최대값을 계산합니다.
- `ROWS CURRENT ROW`는 현재 행만을 참조하기 때문에, 이 경우 `MAX` 함수는 현재 행의 연봉 값을 그대로 반환합니다.
- 의미 있는 계산을 위해서는 더 넓은 범위(`ROWS BETWEEN` 등)를 설정하여 누적 최대값을 계산하거나 특정 범위에서 최대값을 찾는 것이 일반적입니다.