문제
다음 윈도우 함수의 결과로 가장 적절한 것은?
<데이터>
| ID | VAL |
|---|---|
| 1 | 1 |
| 2 | 3 |
| 3 | 5 |
| 4 | 5 |
| 5 | 5 |
SQLSELECT ID, VAL, COUNT(*) OVER( ORDER BY VAL, ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS CNT FROM T;
ID가 3이고 VAL이 5인 행의 CNT 값은?
① 1 ② 2 ③ 3 ④ 5
정답
3번
해설
정답: 3. ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW는 첫 행부터 현재 물리적 행까지를 프레임으로 잡는다. ORDER BY VAL, ID 기준으로 정렬하면 ID 3 행은 세 번째 행이므로 프레임에는 ID 1, ID 2, ID 3 총 3개 행이 포함된다.
오답 풀이
- 1번: 현재 행만 세는 프레임이 아니다.
- 2번: 현재 행 이전의 두 행만 고려한 값이다.
- 3번: 첫 행부터 현재 행까지 3개이므로 정답이다.
- 4번: RANGE 기준으로 동순위까지 포함하는 경우와 혼동한 값이다.
보충 개념 ROWS는 물리적 행 단위로 프레임을 계산한다. 동점 정렬값이 있을 때 결과를 명확히 하려면 ORDER BY에 고유한 정렬 기준을 추가하는 것이 좋다.