メインコンテンツへスキップ
ウィンドウ関数を使用すると、現在の行に関連する行の集合に対して計算を実行できます。 実行できる計算の中には集約関数で行えるものと似たものもありますが、ウィンドウ関数では行が単一の出力にグループ化されることはなく、個々の行はそのまま返されます。

標準的なウィンドウ関数

ClickHouse は、ウィンドウおよびウィンドウ関数を定義するための標準的な構文をサポートしています。以下の表は、各機能が現在サポートされているかどうかを示しています。

ClickHouse固有のウィンドウ関数

以下のClickHouse固有のウィンドウ関数も利用できます。

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

timestamp_column に基づいて、指定された metric_column の非負の導関数を求めます。 INTERVAL は省略可能で、デフォルトは INTERVAL 1 SECOND です。 各行の計算値は次のとおりです。
  • 1行目は 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) に対して評価された、最初の非 NULL 値を返します。
  • rank() - 現在の行に、パーティション内で飛び番ありの順位を付けます。
  • dense_rank() - 現在の行に、パーティション内で飛び番なしの順位を付けます。
  • lagInFrame(x) - 順序付けされたフレーム内で、現在の行より前の指定された物理オフセットにある行で評価された値を返します。
  • leadInFrame(x) - 順序付けされたフレーム内で、現在の行の後ろに offset 行だけ離れた行で評価された値を返します。

ウィンドウ関数の使用例をいくつか見てみましょう。

行番号の付与

集計関数

各選手の給与を所属チームの平均給与と比較します。
各選手の給与をチーム内の最高額と比較します。

カラムによるパーティション化

フレーム境界の指定

┌─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 Issues

ウィンドウ関数 の初期サポートに向けたロードマップは、この issue にあります。 ウィンドウ関数 に関連するすべての GitHub issue には、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 Docs

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 Docs

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日