Skip to main content
ウィンドウ関数を使用すると、現在の行に関連する行の集合に対して計算を実行できます。 集約関数で行う計算と似た計算にも使用できますが、ウィンドウ関数では行が単一の出力にグループ化されることはなく、個々の行はそのまま返されます。

標準ウィンドウ関数

ClickHouse は、ウィンドウおよびウィンドウ関数に対する標準 SQL 構文をサポートしています。 以下の表は、現在サポートされている機能を示しています。

構文

  • PARTITION BY - 結果セットをどのようにグループに分けるかを定義します。
  • ORDER BY - aggregate_function の計算時に、グループ内の行をどのような順序で並べるかを定義します。
  • ROWSRANGE、または GROUPS - フレームの境界を定義し、aggregate_function はそのフレーム内で計算されます。ROWS は物理行を数え、RANGEORDER BY の値を数え、GROUPS はピアグループ (ORDER BY キーが等しい行) を数えます。
  • WINDOW - 複数の式で同じウィンドウ定義を使えるようにします。

ウィンドウ関数としてのみ使用できる関数

以下の関数は、ウィンドウ関数としてのみ使用できます。ほとんどは標準 SQL 関数ですが、lagInFrameleadInFramenonNegativeDerivative は ClickHouse の拡張機能です。

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

行番号の付与

集計関数

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

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

フレームの境界

GROUPS フレーム

GROUPS フレームは、物理的な行 (ROWS) や ORDER BY 値 (RANGE) ではなく、ORDER BY キーが等しい行の集合である ピアグループ 全体を数えます。N PRECEDINGN FOLLOWING は、現在の行のピアグループの前後にある N 個のピアグループを数え、範囲に含まれるピアグループは常にそのすべての行を含みます。 以下のクエリでは、ROWSRANGEGROUPS フレームに同じ 1 PRECEDING AND 1 FOLLOWING 境界を適用します。order カラムには重複した非連続の値が含まれるため、3 つのモードで対象となる行は異なります。
各モードで境界の解釈は異なります。
  • ROWS は物理的な行数に基づくため、フレームは最大で連続する3行、つまり現在の行とその前後それぞれ1行になります。
  • RANGEorder 値に基づくため、1 PRECEDING1 FOLLOWING には、現在の行の order 値との差が1以内の行が含まれます。間隔が10ある場合、隣接行は条件を満たさないため、フレームには現在の order を共有する行のみが含まれます。
  • GROUPS はピアグループに基づくため、1 PRECEDING1 FOLLOWING には、order 値間のギャップにかかわらず、隣接するグループ全体が常に含まれます。

実践的な例

以下の例では、現実によくある問題を解決する方法を示します。

部門ごとの最高給与/給与総額

累積和

移動平均/スライディング平均 (3行ごと)

移動平均/スライディング平均 (10秒ごと)

移動平均 / スライディング平均 (10日ごと)

温度は秒精度で保存されていますが、RangeORDER BY toDate(ts) を使用すると、サイズ 10 単位のフレームが形成され、toDate(ts) によってその単位は日になります。

参考資料

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年8月14日