표준 윈도우 함수
| 기능 | 지원 여부 |
|---|---|
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 프레임 | ✅ (기본값) |
DateTime RANGE OFFSET 프레임용 INTERVAL 구문 | ❌ (RANGE는 모든 숫자형에서 작동하므로 대신 초 단위 숫자를 지정하십시오.) |
GROUPS 프레임 | ❌ |
프레임에 대한 집계 함수 계산 (sum(value) over (order by time)) | ✅ (모든 집계 함수가 지원됩니다) |
rank(), dense_rank(), row_number() | ✅ 별칭: denseRank() |
percent_rank() | ✅ 데이터셋의 파티션 내에서 값의 상대적 순위를 효율적으로 계산합니다. 이 함수는 ifNull((rank() OVER(PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER(PARTITION BY x) - 1, 0), 0)처럼 더 장황하고 계산 비용이 큰 수동 SQL 계산을 사실상 대체합니다. 별칭: percentRank() |
cume_dist() | ✅ 값 그룹 내에서 값의 누적 분포를 계산합니다. 현재 행의 값보다 작거나 같은 값을 가진 행의 비율을 반환합니다. |
lag/lead(value, offset) | ✅ 다음 우회 방법 중 하나를 사용할 수도 있습니다. 1) any(value) over (.... rows between <offset> preceding and <offset> preceding) 또는 lead의 경우 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) |
ClickHouse 전용 윈도 함수
다음과 같은 ClickHouse 전용 윈도 함수를 제공합니다:nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])
timestamp_column을 기준으로 지정된 metric_column의 음수가 아닌 미분값을 계산합니다.
INTERVAL은 생략할 수 있으며, 기본값은 INTERVAL 1 SECOND입니다.
각 행에 대해 계산되는 값은 다음과 같습니다:
- 첫 번째 행:
0, - 번째 행: .
구문
PARTITION BY- 결과 집합을 어떻게 그룹으로 나눌지 정의합니다.ORDER BY- aggregate_function을 계산할 때 그룹 내 행의 순서를 정의합니다.ROWS or RANGE- 프레임의 경계를 정의하며, aggregate_function은 프레임 내에서 계산됩니다.WINDOW- 여러 표현식에서 동일한 윈도우 정의를 사용할 수 있도록 합니다.
함수
row_number()- 현재 행이 속한 파티션 내에서 1부터 시작하는 번호를 매깁니다.first_value(x)- 정렬된 프레임 내에서 평가된 첫 번째 값을 반환합니다.last_value(x)- 정렬된 프레임 내에서 평가된 마지막 값을 반환합니다.nth_value(x, offset)- 정렬된 프레임에서 n번째 행(offset)을 기준으로 평가된 첫 번째 non-NULL 값을 반환합니다.rank()- 현재 행이 속한 파티션 내에서 중간 순위를 건너뛰는 방식으로 순위를 매깁니다.dense_rank()- 현재 행이 속한 파티션 내에서 중간 순위를 건너뛰지 않는 방식으로 순위를 매깁니다.lagInFrame(x)- 정렬된 프레임 내에서 현재 행보다 지정한 물리적 오프셋만큼 앞에 있는 행에서 평가된 값을 반환합니다.leadInFrame(x)- 정렬된 프레임 내에서 현재 행보다 오프셋 행 수만큼 뒤에 있는 행에서 평가된 값을 반환합니다.
예시
행 번호 지정
집계 함수
컬럼별 파티셔닝
프레임 경계 설정
실제 사용 예시
부서별 최대/총 급여
누적합
이동 평균 / 슬라이딩 평균(3개 행 기준)
이동 평균 / 슬라이딩 평균(10초 기준)
이동 평균 / 슬라이딩 평균(10일 기준)
Range와 ORDER BY toDate(ts)를 사용하면 크기가 10인 프레임이 형성되며, toDate(ts)를 사용하므로 단위는 일입니다.