標準ウィンドウ関数
| Feature | Supported? | 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- 複数の式で同じウィンドウ定義を使えるようにします。
ウィンドウ関数としてのみ使用できる関数
lagInFrame、leadInFrame、nonNegativeDerivative は ClickHouse の拡張機能です。
| Function | Description |
|---|---|
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日ごと)
Range と ORDER BY toDate(ts) を使用すると、サイズ 10 単位のフレームが形成され、toDate(ts) によってその単位は日になります。