標準的なウィンドウ関数
| Feature | Supported? |
|---|---|
アドホックなウィンドウ指定 (count(*) over (partition by id order by time desc)) | ✅ |
ウィンドウ関数を含む式 (例: (count(*) over ()) / 2) | ✅ |
WINDOW 句 (select ... from table window w as (partition by id)) | ✅ |
ROWS フレーム | ✅ |
RANGE フレーム | ✅ (デフォルト) |
DateTime の RANGE OFFSET フレームに対する INTERVAL 構文 | ❌ (代わりに秒数を指定してください (RANGE は任意の数値型で使用できます) 。) |
GROUPS フレーム | ❌ |
フレームに対する集約関数の計算 (sum(value) over (order by time)) | ✅ (すべての集約関数をサポート) |
rank(), dense_rank(), row_number() | ✅ Alias: denseRank() |
percent_rank() | ✅ データセット内のパーティションにおける値の相対的な順位を効率的に計算します。この関数は、ifNull((rank() OVER(PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER(PARTITION BY x) - 1, 0), 0) のような、より冗長で計算コストの高い手動の SQL 計算を実質的に置き換えるものです Alias: percentRank() |
cume_dist() | ✅ 値のグループ内での累積分布を計算します。現在の行の値以下の値を持つ行の割合を返します。 |
lag/lead(value, offset) | ✅ 次のいずれかの回避策も使用できます。 1) any(value) over (.... rows between <offset> preceding and <offset> preceding)、または lead の場合は 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) のようにウィンドウを指定してください。 |
ClickHouse固有のウィンドウ関数
以下のClickHouse固有のウィンドウ関数も利用できます。nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])
timestamp_column に基づいて、指定された metric_column の非負の導関数を求めます。
INTERVAL は省略可能で、デフォルトは INTERVAL 1 SECOND です。
各行の計算値は次のとおりです。
- 1行目は
0 - 行目は
構文
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 行だけ離れた行で評価された値を返します。
例
行番号の付与
集計関数
カラムによるパーティション化
フレーム境界の指定
実践的な例
部門ごとの最高給与/給与総額
累積和
移動平均 / スライディング平均 (3行単位)
移動平均/スライディング平均 (10秒ごと)
移動平均 / スライディング平均 (10日単位)
Range と ORDER BY toDate(ts) を使うことで、サイズが 10 単位のフレームを作成します。toDate(ts) を使っているため、その単位は日です。