코드 11-21의 프레임 절을 보면 파티션의 첫 번째 로우부터 현재 로우까지 범위를 지정합니다(BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW). 하나는 ROWS를, 다른 하나는 RANGE를 사용하고 SUM 함수로 급여의 합을 구합니다. ROWS는 무조건 로우 단위이므로 파티션 첫 번째 로우부터 현재 로우까지 급여를 합한 값을 반환합니다. 따라서 IT 부서에서 103번은 9000, 104번은 103과 104의 급여를 더한 15000, 105번은 103, 104, 105번 급여를 더한 19800을 반환합니다.
RANGE는 ROWS와 기본적인 연산 방식은 같습니다. 다만, 105번은 rows_value와 range_value 값이 다릅니다. 먼저 ROWS는 로우 단위로 프레임을 지정하므로 파티션 첫 번째 로우에서 현재 로우까지 급여 합을 구합니다. 따라서 105번은 19800을, 106번은 103, 104, 105, 106번 급여를 더한 24600을 반환합니다.
RANGE는 값의 범위 단위로 프레임 지정합니다. 105번과 106번 사원의 급여가 4800으로 같아서 이 둘은 같은 프레임에 속하게 됩니다. 따라서 105번은 103, 104, 105번의 급여에 106번의 급여도 더한 24600을 반환합니다. 106번 사원도 마찬가지로 같은 값을 반환합니다.
코드 11-22
SELECT employee_id, emp_name, dept_name, salary,
SUM(salary) OVER (PARTITION BY dept_name
ORDER BY salary DESC
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) rows_value,
SUM(salary) OVER (PARTITION BY dept_name
ORDER BY salary DESC
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) range_value
FROM emp_hierarchy
WHERE dept_name IN ('IT', 'Finance')
ORDER BY 3, 4 DESC;