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

표준 윈도우 함수

ClickHouse는 윈도우와 윈도우 함수를 정의하는 표준 구문을 지원합니다. 아래 표는 현재 각 기능의 지원 여부를 보여줍니다.

ClickHouse 전용 윈도 함수

다음과 같은 ClickHouse 전용 윈도 함수를 제공합니다:

nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])

timestamp_column을 기준으로 지정된 metric_column의 음수가 아닌 미분값을 계산합니다. INTERVAL은 생략할 수 있으며, 기본값은 INTERVAL 1 SECOND입니다. 각 행에 대해 계산되는 값은 다음과 같습니다:
  • 첫 번째 행: 0,
  • ii번째 행: metricimetrici1timestampitimestampi1interval{\text{metric}_i - \text{metric}_{i-1} \over \text{timestamp}_i - \text{timestamp}_{i-1}} * \text{interval}.

구문

  • 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) - 정렬된 프레임 내에서 현재 행보다 오프셋 행 수만큼 뒤에 있는 행에서 평가된 값을 반환합니다.

예시

윈도우 함수를 사용하는 몇 가지 예시를 살펴보겠습니다.

행 번호 지정

집계 함수

각 선수의 급여를 소속 팀의 평균 급여와 비교합니다.
각 선수의 급여를 소속 팀의 최고 급여와 비교합니다.

컬럼별 파티셔닝

프레임 경계 설정

┌─part_key─┬─value─┬─order─┬─frame_values─┬─rn_1─┬─rn_2─┬─rn_3─┬─rn_4─┐ │ 1 │ 1 │ 1 │ [5,4,3,2,1] │ 5 │ 5 │ 5 │ 2 │ │ 1 │ 2 │ 2 │ [5,4,3,2] │ 4 │ 4 │ 4 │ 2 │ │ 1 │ 3 │ 3 │ [5,4,3] │ 3 │ 3 │ 3 │ 2 │ │ 1 │ 4 │ 4 │ [5,4] │ 2 │ 2 │ 2 │ 2 │ │ 1 │ 5 │ 5 │ [5] │ 1 │ 1 │ 1 │ 1 │ └──────────┴───────┴───────┴──────────────┴──────┴──────┴──────┴──────┘
┌─frame_values_1─┬─second_value─┐ │ [1] │ ᴺᵁᴸᴸ │ │ [1,2] │ 2 │ │ [1,2,3] │ 2 │ │ [1,2,3,4] │ 2 │ │ [2,3,4,5] │ 3 │ └────────────────┴──────────────┘

실제 사용 예시

다음 예시는 실제 환경에서 자주 접하는 문제를 해결하는 방법을 보여줍니다.

부서별 최대/총 급여

누적합

이동 평균 / 슬라이딩 평균(3개 행 기준)

insert into sensors values(‘cpu_temp’, ‘2020-01-01 00:00:00’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:01’, 77), (‘cpu_temp’, ‘2020-01-01 00:00:02’, 93), (‘cpu_temp’, ‘2020-01-01 00:00:03’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:04’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:05’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:06’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:07’, 87);

이동 평균 / 슬라이딩 평균(10초 기준)

이동 평균 / 슬라이딩 평균(10일 기준)

온도는 초 단위 정밀도로 저장되지만, RangeORDER BY toDate(ts)를 사용하면 크기가 10인 프레임이 형성되며, toDate(ts)를 사용하므로 단위는 일입니다.
insert into sensors values(‘ambient_temp’, ‘2020-01-01 00:00:00’, 16), (‘ambient_temp’, ‘2020-01-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-01-02 11:00:00’, 9), (‘ambient_temp’, ‘2020-01-02 12:00:00’, 9), (‘ambient_temp’, ‘2020-02-01 10:00:00’, 10), (‘ambient_temp’, ‘2020-02-01 12:00:00’, 10), (‘ambient_temp’, ‘2020-02-10 12:00:00’, 12), (‘ambient_temp’, ‘2020-02-10 13:00:00’, 12), (‘ambient_temp’, ‘2020-02-20 12:00:01’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16);

참고

GitHub 이슈

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

테스트

다음 테스트에는 현재 지원되는 문법의 예시가 포함되어 있습니다. https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_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년 6월 19일