메인 콘텐츠로 건너뛰기
윈도 함수를 사용하면 현재 행과 관련된 행 집합 전체에 걸쳐 계산을 수행할 수 있습니다. 집계 함수로 수행하는 계산과 비슷한 계산을 수행하는 데 사용할 수 있지만, 윈도 함수는 행을 하나의 출력으로 그룹화하지 않으므로 개별 행이 그대로 반환됩니다.

표준 윈도우 함수

ClickHouse는 윈도우 및 윈도 함수에 대한 표준 SQL 문법을 지원합니다. 아래 표는 현재 지원되는 기능을 보여줍니다:
기능지원 여부비고
즉석 윈도우 지정 (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 - 여러 표현식에서 동일한 윈도우 정의를 사용할 수 있도록 합니다.

윈도 함수로만 사용할 수 있는 함수

다음 함수는 윈도 함수로만 사용할 수 있습니다. 대부분은 표준 SQL 함수이며, 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일 단위)

온도는 초 단위 정밀도로 저장되지만, RangeORDER BY toDate(ts)를 사용하면 크기가 10인 프레임(frame)이 형성되고, toDate(ts)를 사용하므로 단위는 일입니다.

참고

GitHub 이슈

윈도우 함수의 초기 지원 로드맵은 이 이슈에 정리되어 있습니다. 윈도우 함수와 관련된 모든 GitHub 이슈에는 comp-window-functions 레이블이 지정되어 있습니다.

테스트

다음 테스트에는 현재 지원되는 문법의 예시가 포함되어 있습니다. https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window&#95;functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0&#95;stateless/01591&#95;window&#95;functions.sql

Postgres 문서

https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS https://www.postgresql.org/docs/devel/functions-window.html https://www.postgresql.org/docs/devel/tutorial-window.html

MySQL 문서

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html
마지막 수정일 2026년 7월 2일