윈도우 함수
- 윈도우 함수는 결과에 대한 함수 처리이므로 사용 전 후의 결과 건수는 동일
- 현재 레코드 기준 이전 또는 이후 위치의 레코드 접근 가능 → ROWS, RANGE
ROWS
(현재 행 기준 몇개의 행을 포함하는지. 물리적)
RANGE
(현재 행을 기준으로 어떤 값의 범위를 포함하는지. 논리적)
- RANGE BETWEEN start_point AND end_point
- start point는 end_point와 같거나 작은 값이 들어감
- Default: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
- UNBOUNDED
: 해당 파티션의 끝까지
- PRECEDING
: 현재 행에서 앞쪽의 행
- 3 PRECEDING
: 현재행부터 3앞
- UNBOUNDED PRECEDING
- 시작위치가 첫번째. start_point에만 사용 가능. end point에서 사용 불가
- FOLLOWING
: 현재 행에서 뒷쪽의 행. BETWEEN~AND~ 사용 필수
- BETWEEN 1000 PRECEDING AND 1000 FLLOWING
: -1000 ~ +1000 사이
- UNBOUNDED FOLLOWING
- 파티션의 끝까지. end_point에만 사용 가능
- CURRENT ROW
- start_point, end_point 둘 다 가능
- 윈도우는 CURRENT ROW에서 start하거나 end
RANK()
: 동일 값에 동일 순위. 중간순위는 비움. 1, 1, 3, 4, 4, …
DENSE_RANK()
: 동일 값에 동일 순위. 중간순위 비우지 않음. 1, 1, 2, 3, 3, …
ROW_NUMBER()
: 동일 값에도 유일한 순위 부여. 1, 2, 3, 4, 5, …
Partition by
- Partition과 GROUP BY 구문은 의미적으로 유사
- Partition 구문이 없으면 전체 집합을 하나의 Partition으로 정의한 것과 동일
- 윈도우 함수 적용 범위는 Partition을 넘을 수 없음
Order by
LAG
: 파티션별 윈도우에서 이전 몇번째 행의 값을 가져옴
LEAD
: 파티션별 윈도우에서 이후 몇번째 행의 값을 가져옴
(SQL Server는 미지원)
ntile
: 파티션별 전체 건수를 ARGUMENT 값으로 N 등분한 결과를 구함
- ANSI/ISO SQL 표준에는 없지만 Oracle, SQL Server 에서 지원