창 함수
창 함수 (Window Functions)
창 함수(window functions)는 window 라고 불리는 행 그룹에 대한 일종의 집계입니다. 각 행에 대해 해당 행 그룹을 기반으로 집계 값을 반환합니다.
출처: 문서
본문
설명 (Description)
창 함수(window functions)는 window 라고 불리는 행 그룹에 대한 일종의 집계입니다. 각 행에 대해 행 그룹을 기반으로 집계 값을 반환합니다.
문법 (Syntax)
window_function OVER ( [ { PARTITION | DISTRIBUTE } BY colName ( [, ... ] ) ]
{ ORDER | SORT } BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ]
[ window_frame ] )
매개변수 (Parameters)
window_function
Hive dialect 은 다음 창 함수를 지원합니다:
-
Windowing functions (윈도우 함수)
- LEAD
- LAG
- FIRST_VALUE
- LAST_VALUE
참고: FIRST_VALUE/LAST_VALUE 의 경우 null 값을 건너뛸지 존중할지 제어하는 매개변수는 아직 지원되지 않습니다. 그리고 이들은 항상 null 값을 건너뜁니다.
-
Analytic functions (분석 함수)
- RANK
- ROW_NUMBER
- DENSE_RANK
- CUME_DIST
- PERCENT_RANK
- NTILE
-
Aggregate Functions (집계 함수)
- COUNT
- SUM
- MIN
- MAX
- AVG
window_frame
어느 행에서 시작하고 어디서 끝날지를 지정하는 데 사용됩니다. 창 프레임은 다음 형식을 지원합니다:
(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING
ORDER BY 가 지정되었지만 window_frame 이 없으면 창 프레임의 기본값은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 입니다.
ORDER BY 와 window_frame 이 모두 없으면 창 프레임의 기본값은 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 입니다.
참고: 창 함수에서는 Distinct 가 아직 지원되지 않습니다.
예제 (Examples)
-- PARTITION BY with one partitioning column, no ORDER BY or window specification
SELECT a, COUNT(b) OVER (PARTITION BY c) FROM t;
-- PARTITION BY with two partitioning columns, no ORDER BY or window specification
SELECT a, COUNT(b) OVER (PARTITION BY c, d) FROM t;
-- PARTITION BY with two partitioning columns, no ORDER BY or window specification
SELECT a, SUM(b) OVER (PARTITION BY c, d ORDER BY e, f) FROM t;
-- PARTITION BY with partitioning, ORDER BY, and window specification
SELECT a, SUM(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM t;
SELECT a, AVG(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
FROM t;
SELECT a, AVG(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING)
FROM t;
SELECT a, AVG(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
FROM t;