문제
아래 설명을 만족하는 SQL로 알맞은 것은?
<지문> 부서별로 연봉을 오름차순 정렬하고, 현재 연봉 기준 -100부터 +200 사이의 연봉자 수를 구한다.
① SELECT emp_id, salary, COUNT() OVER (PARTITION BY dep_id ORDER BY salary ROWS BETWEEN 100 PRECEDING AND 200 FOLLOWING) AS salary_count FROM emp ② SELECT emp_id, salary, COUNT() OVER (PARTITION BY dep_id ORDER BY salary RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING) AS salary_count FROM emp ③ SELECT emp_id, salary, COUNT() OVER (PARTITION BY dep_id) AS salary_count FROM emp ④ SELECT emp_id, salary, COUNT() OVER (ORDER BY salary RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING) AS salary_count FROM emp
정답
2번
해설
정답: 2. 연봉 값의 범위 -100부터 +200 사이를 기준으로 세야 하므로 ROWS가 아니라 RANGE를 사용하고, 부서별 계산을 위해 PARTITION BY dep_id가 필요하다.
오답 풀이
- 1번: ROWS는 물리적 행 수 기준이므로 연봉 값 범위 조건에 맞지 않는다.
- 2번: 부서별 파티션과 연봉 값 범위 프레임을 올바르게 사용했다.
- 3번: 부서 전체 건수만 계산하고 연봉 범위를 반영하지 않는다.
- 4번: 부서별 파티션이 없어 전체 기준으로 계산된다.
보충 개념 ROWS는 행 개수 기준, RANGE는 ORDER BY 값의 논리적 범위 기준이다. 급여 ± 범위 같은 문제는 RANGE 프레임을 사용한다.