1. 왜 Window인가?
- Window function의 목적 : 행과 행 간의 관계를 쉽게 표현(정의/비교/연산)하기 위함
- 나오게된 배경 : 기존의 RDBMS는 컬럼 간(column-column) 관계를 다루었음. 행 간의 관계를 다루기 위해서는 PL/SQL 또는 인라인 뷰(Inline View)를 활용해야 했음. 이 과정의 불편함을 해소하기 위해 window function이 출시됨
- ‘Window’ 명칭 : 행과 행 간의 관계를 다루는 과정에서 필연적으로 관계의 범위를 한정해야 함. 이것이 행을 둘러싼 프레임(frame) 또는 창(window) 같다고 하여 ‘window’란 명칭이 부여됨 (아래 그림1 참고)
- OVER 절 : 범위를 한정시키는 문법 규칙은 후술되는 OVER 절에 귀속됨. 결국 OVER절을 얼마나 잘 이해하고 사용하느냐가 Window function의 관건임 (WINDOW_FUNCTION은 기본)
(참고 그림1)
2. 문법
SELECT WINDOW_FUNCTION (ARGUMENTS) OVER ( [PARTITION BY 칼럼] [ORDER BY 절] [WINDOWING 절] ) FROM 테이블 명;
*OVER 절은 필수. 구성 요소는 다음과 같음 :
– PARTITION BY 절 : 전체 집합을 기준 (컬럼) 에 의해 소그룹으로 구분
– ORDER BY 절 : 어떤 항목 (컬럼) 에 대해 순위를 지정할 지 기술
– WINDOWING 절 : 함수의 대상이 되는 행 기준의 범위를 강력하게 지정
WINDOWING 절
ROWS 는 물리적인 결과 행의 수, RANGE 는 논리적인 값에 의한 범위
2 中 1 택
BETWEEN 사용 타입
ROWS | RANGE BETWEEN
UNBOUNDED PRECEDING | CURRENT ROW | VALUE_EXPR PRECEDING/FOLLOWING
AND
UNBOUNDED FOLLOWING | CURRENT ROW | VALUE_EXPR PRECEDING/FOLLOWING
BETWEEN 미사용 타입
ROW | RANGE
UNBOUNDED PRECEDING | CURRENT ROW | VALUE_EXPR PRECEDING
3. WINDOW_FUNCTION 종류
- 순위함수 : RANK, DENSE_RANK, ROW_NUMBER
*동일 값에 대해서는 동일 순위를 매김 - 집계함수 : SUM, MAX, MIN, AVG, COUNT
- 순서함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD
- 비율함수 : CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT
- 선형 분석을 포함한 통계 분석 관련 함수
참고
https://en.wikipedia.org/wiki/SQL_window_function
http://www.dbguide.net/db.db?cmd=view&boardUid=148205&boardConfigUid=9&categoryUid=216&boardIdx=135&boardStep=1
http://wiki.gurubee.net/pages/viewpage.action?pageId=27427796