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

標準ウィンドウ関数

ClickHouse は、ウィンドウおよびウィンドウ関数に対する標準 SQL 構文をサポートしています。 以下の表は、現在サポートされている機能を示しています。
FeatureSupported?Comment
アドホックなウィンドウ指定 (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()パーティション内での値の相対順位を効率的に計算します。これは、ifNull((rank() OVER (PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER (PARTITION BY x) - 1, 0), 0) で表される、より冗長でコンピュート負荷の高い手動の SQL 計算を置き換えます。
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 関数ですが、lagInFrameleadInFramenonNegativeDerivative は ClickHouse の拡張機能です。
FunctionDescription
row_number()現在の行に、パーティション内で 1 から始まる番号を付けます。
first_value(x)順序付けされたフレーム内で評価された最初の値を返します。
last_value(x)順序付けされたフレーム内で評価された最後の値を返します。
nth_value(x, offset)順序付けされたフレーム内の n 番目の行 (offset) で評価された、最初の非 NULL 値を返します。
rank()現在の行に、パーティション内でギャップありの順位を付けます。
dense_rank()現在の行に、パーティション内でギャップなしの順位を付けます。
lagInFrame(x)順序付けされたフレーム内で、現在の行より指定した物理オフセット分だけ前にある行で評価された値を返します。
leadInFrame(x)順序付けされたフレーム内で、現在の行より offset 行後にある行で評価された値を返します。
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])timestamp_column に対する metric_column の非負の導関数を計算します。ClickHouse 固有です。

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

行番号の付与

集計関数

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

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

フレームの境界

実践的な例

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

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

累積和

移動平均/スライディング平均 (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&#95;functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0&#95;stateless/01591&#95;window&#95;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月25日