WINDOW FUNATION 에서 OVER랑 같이쓰는 구문
1.RANGE UNBOUNDED PRECEDING
2.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
3.RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
일단 이기능은 SQL전문가가이드 2과목에서 다루고있어서 알게된 기능인데. 그룹별로 누적된 값을 구할수 있고
여러 옵션값들로 범위에 제한을 둘수도 있다.
범위지정옵션으로는 RANGE , ROWS 가 있는데
둘의차이는 RANGE는 ORDER로 정렬된 칼럼중 같은값을 가지는 로우가 있다면
묶어서 한번에 연산하지만 ROWS는 각로우마다 계산하여 준다.
1.RANGE UNBOUNDED PRECEDING : 현재 행을 기준으로 해서 파티션 내의 첫번째 행까지 범위를 지정한다.
위세가지 쿼리는 같은 결과값을 반환한다.
두번째쿼리는 오라클에서 동일하게 해석하고
세번째쿼리는 디폴트값이 적용되어 RANGE UNBOUNDED PRECEDING 가 적용된것이다.
쿼리 결과값을 보면 MGR로 파티션을 나눈것을 볼수있는데. 3번째행 JAMES부터 값들이 누적된것을
볼수있다. WARDM,MARTIN을 보면 누적이 안되고 3450이 출력되었는데 이것은 같은
ORDER로 취급되어 같이 더해버려서 같은값이 출력된것이다.
ORDER를 ENAME으로 바꿔서 쿼리를 작성했을때 정상적으로 누계가 되는것을 확인할수있다.
2.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING : 현재 행을 기준으로 파티션내 앞뒤 한건씩을 범위로 지정
쿼리를 보면 MGR로 칼럼을 나누었다. 결과값을 보면 알수있듯이
첫번째행(앞행) 마지막행(뒷행) 없어서 앞행or뒷행 만 포함되어 나누기 2를 하여 나온 결과값이다.
위에것에서 비트윈 값을 바꾸어서 하면 어떻게될까?
동일하게 적용되지만 레코드를 다르게 가지고와 계산값이 달라진다.
TURNER 을 보면 앞행3(2까지밖에없음) 뒷행2인데 전체 평균값이 나온다.
MARTIN도 마찬가지다
3.RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING: 같은 파티션내 현재행부터 마지막행까지
몇가지 포인트를 정리하자면
디폴트값 : RANGE UNBOUNDED PRECEDING
시작어: RANGE or ROWS
*BETWEEN에서 사용하는 구문 ( BETWEEN 을 지정하면 Start AND End 까지 범위지정 )
: CURRENT ROW : 현재 진행로우
: ROW PRECEDING : ROW에 입력된 개수 전 레코드 까지(BETWEEN 앞부분)
: ROW FOLLOWING : ROW에 입력된 개수 후 레코드 까지(BETWEEN 뒷부분)