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