윈도우 함수
윈도우 함수 (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). |
DateTime의 RANGE OFFSET 프레임을 위한 INTERVAL 구문 |
❌ | 대신 초(second) 단위를 지정하세요 (RANGE는 모든 숫자 타입에서 동작). |
GROUPS 프레임 |
✅ | 프레임 경계가 전체 동률 그룹(peer group, ORDER BY 키가 같은 행들)을 셈; N PRECEDING과 N 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 BY—aggregate_function을 계산할 때 그룹 안의 행을 정렬하는 방법을 정의해요.ROWS,RANGE,GROUPS— 프레임의 경계를 정의하며,aggregate_function은 프레임 안에서 계산됩니다.ROWS는 물리적 행을 세고,RANGE는ORDER BY값을 세며,GROUPS는 동률 그룹(ORDER BY키가 같은 행들)을 세요.WINDOW— 여러 표현식이 같은 윈도우 정의를 사용할 수 있게 해줘요.
PARTITION
┌─────────────────┐
Postgres 문서 (Postgres Docs)
MySQL 문서 (MySQL Docs)
관련 콘텐츠 (Related Content)
- 블로그: ClickHouse에서 시계열 데이터 다루기 (Working with time series data in ClickHouse)
- 블로그: Git 커밋 시퀀스를 위한 윈도우 및 배열 함수 (Window and array functions for Git commit sequences)
- 블로그: ClickHouse로 데이터 넣기 - 3부 - S3 사용하기 (Getting Data Into ClickHouse - Part 3 - Using S3)