창 함수

창 함수 (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 BYwindow_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;

더 알아보기 (Learn more)