실행결과
코드 11-22의 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING은 현재 로우의 앞 로우부터 뒤 로우까지가 대상입니다. 따라서 앞 로우 + 현재 로우 + 뒤 로우의 값을 합한 값을 반환합니다. IT 부서의 rows_value 값을 보면 103번은 앞 로우가 없고, 현재 로우와 뒤 로우가 대상이므로 103과 104번의 급여를 더한 15000(9000 + 6000)이 반환됐습니다. 104번은 103, 104, 105번 급여를 합한 19800(9000 + 6000 + 4800)이 반환됐죠. 마지막 107번은 뒤 로우가 없으므로 9000(4800 + 4200)이 반환됐습니다.
그리고 RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING은 RANGE를 사용하므로 1000은 로우 수가 아닌 값으로 여기서는 급여를 의미합니다. 1000 PRECEDING은 (현재 로우의 값 – 1000)을 의미하고 1000 FOLLOWING은 (현재 로우 값 + 1000)을 의미합니다. 예를 들어 105번의 현재 로우 값이 4800이므로 3800(4000 – 1000)에서 5800(4000 + 1000) 사이의 값을 가진 로우가 SUM(salary)의 대상이 됩니다. 이 범위에 속한 건은 105, 106, 107번이므로 이 3건의 급여를 더한 13800(4800 + 4800 + 4200)을 반환했고, 106, 107번도 같은 값을 반환했습니다.
이렇게 프레임 절은 ROWS와 RANGE를 사용했을 때 계산 대상 로우를 선정하는 방식이 다르며 프레임의 시작과 끝을 지정하는 방식에 따라서도 최종 반환값이 달라져서 좀 복잡합니다. 하지만 계산 원리를 이해하면 그리 어렵지 않게 사용할 수 있을 겁니다.