윈도우 함수

윈도우 함수 (Window Functions)

윈도우 함수(window function)는 현재 행과 관련된 행들의 집합에 걸쳐 계산을 수행하게 해줘요. 집계 함수와 비슷한 계산을 할 수 있지만, 차이가 있다면 윈도우 함수는 행들을 단일 출력으로 묶지 않는다는 점이에요. 대신 개별 행이 그대로 반환됩니다.

출처: 문서

본문

표준 윈도우 함수 (Standard window functions)

ClickHouse는 윈도우와 윈도우 함수를 위한 표준 SQL 문법을 지원합니다. 아래 표는 현재 지원되는 기능을 보여줘요:

기능 (Feature) 지원 여부 설명 (Comment)
임시(Ad hoc) 윈도우 명세 (count(*) OVER (PARTITION BY id ORDER BY time DESC))
윈도우 함수를 포함한 표현식, 예: (count(*) OVER ()) / 2
WINDOW 절 (SELECT ... FROM table WINDOW w AS (PARTITION BY id))
ROWS 프레임
RANGE 프레임 프레임을 명시적으로 지정하지 않을 때 기본으로 사용됨 (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW).
DateTimeRANGE OFFSET 프레임을 위한 INTERVAL 구문 대신 초(second) 단위를 지정하세요 (RANGE는 모든 숫자 타입에서 동작).
GROUPS 프레임 프레임 경계가 전체 동률 그룹(peer group, ORDER BY 키가 같은 행들)을 셈; N PRECEDINGN FOLLOWING은 현재 행의 동률 그룹 앞뒤의 N개 동률 그룹을 셈.
프레임 위에서 집계 함수 계산 (sum(value) OVER (ORDER BY time)) 모든 집계 함수가 지원됨.
rank(), dense_rank()/denseRank(), row_number()
percent_rank()/percentRank() 파티션 안에서 값의 상대적 위치를 효율적으로 계산. ifNull((rank() OVER (PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER (PARTITION BY x) - 1, 0), 0)로 표현하던 더 장황하고 계산 비용이 큰 수동 SQL 계산을 대체함.
cume_dist() 값 그룹 안에서 값의 누적 분포를 계산. 현재 행의 값보다 작거나 같은 값을 가진 행의 백분율을 반환.
lag/lead(value, offset) 다음 우회 방법 중 하나를 쓸 수도 있음: 1) any(value) OVER (... ROWS BETWEEN PRECEDING AND PRECEDING), 또는 lead의 경우 PRECEDING 대신 FOLLOWING 2) lagInFrame/leadInFrame — 유사하지만 윈도우 프레임을 존중. lag/lead와 동일한 동작을 얻으려면 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING을 사용하세요.
ntile(buckets) 윈도우를 예: (PARTITION BY x ORDER BY y ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)으로 지정하세요.

구문 (Syntax)

aggregate_function (column_name)
  OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] 
        [ROWS, RANGE, or GROUPS expression_to_bound_rows_within_the_group]] | [window_name])
FROM table_name
WINDOW window_name as ([
  [PARTITION BY grouping_column]
  [ORDER BY sorting_column]
  [ROWS, RANGE, or GROUPS expression_to_bound_rows_within_the_group]
])
  • PARTITION BY — 결과 집합을 그룹으로 나누는 방법을 정의해요.
  • ORDER BYaggregate_function을 계산할 때 그룹 안의 행을 정렬하는 방법을 정의해요.
  • ROWS, RANGE, GROUPS — 프레임의 경계를 정의하며, aggregate_function은 프레임 안에서 계산됩니다. ROWS는 물리적 행을 세고, RANGEORDER BY 값을 세며, GROUPS는 동률 그룹(ORDER BY 키가 같은 행들)을 세요.
  • WINDOW — 여러 표현식이 같은 윈도우 정의를 사용할 수 있게 해줘요.
      PARTITION
┌─────────────────┐  

Postgres 문서 (Postgres Docs)

MySQL 문서 (MySQL Docs)

더 알아보기 (Learn more)