時系列関数
バケット・集計・補間・回帰を CQL 1行で 完了します。別途インストールも、UDF登録も不要です — データベースに組み込まれたネイティブ関数です。
最もよく使う形
-- 시간별 평균, 빈 버킷은 직전 값으로 채운다
SELECT time_bucket_gapfill(1h, timestamp, '2026-07-01', '2026-07-02'),
locf(avg(value))
FROM pp.tm_tag_point
WHERE tag_id = 'TAG-001'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket_gapfill(1h, timestamp, '2026-07-01', '2026-07-02')
ORDER BY timestamp ASC;
🔴 引数の順序に注意してください。 時系列集計はほとんど (값, 시각) の順です — avg(value) のように
値1つだけを受け取る標準集計とは異なります。
関数一覧
バケットとギャップフィル
| 関数 | シグネチャ | 戻り値 | 説明 |
|---|---|---|---|
time_bucket | time_bucket(간격, ts [, 기준시각]) | timestamp | バケット開始時刻。ダウンサンプリング用スカラー |
time_bucket_gapfill | time_bucket_gapfill(폭, ts, 시작, 끝) | timestamp | GROUP BY 用。空のバケットも生成します |
locf | locf(집계) | 引数と同じ型 | 空のバケットを直前の値で埋める (last observation carried forward) |
interpolate | interpolate(집계) | double | 空のバケットを前後の線形補間で埋める |
値の抽出と変化量
| 関数 | シグネチャ | 説明 |
|---|---|---|
first / last | first(값, ts) / last(값, ts) | 時間的に最も早い / 遅い値 |
delta | delta(값, ts) | 最後 − 最初 |
rate | rate(값, ts) | delta ÷ 経過秒 (両端点基準) |
derivative | derivative(값, ts) | 最小二乗回帰の傾き、毎秒 |
counter_delta / counter_rate | (값, ts) | 累積カウンタの増加量 / 毎秒の増加率。リセットを補正します |
累積カウンタには
counter_* を使用してください機器が再起動すると累積カウンタは 0 に戻ります。delta はそれを「負の変化」として読み取り
値が壊れてしまいますが、counter_delta · counter_rate はリセットを検出して補正します。
統計と分布
| 関数 | シグネチャ | 説明 |
|---|---|---|
percentile | percentile(값, q) — q は [0,1] | 正確な連続百分位 (線形補間) |
time_weighted_average | (값, ts) | 時間加重平均 |
integral | (값, ts) | 曲線下面積 (値・秒) |
variance / stddev | (값) | 標本分散 / 標準偏差 |
histogram | (값, 최소, 최대, 버킷수) | 等幅ヒストグラム。長さ 버킷수+2 |
approx_count_distinct | (값) | 近似ユニーク値の個数 |
time_weighted_average と avg は異なりますセンサーが一定間隔で届かないと、単純平均は「頻繁に来る区間」に引っ張られます。 値が維持された時間で重み付けして初めて物理的に正しい平均が得られます。
2変数の関係
| 関数 | 説明 |
|---|---|
corr(y, x) | 相関係数 |
covar_pop(y, x) / covar_samp(y, x) | 母共分散 / 標本共分散 |
regr_slope(y, x) / regr_intercept(y, x) / regr_r2(y, x) | y を x で回帰した傾き・切片・決定係数 |
例
5分バケットでダウンサンプリング
SELECT time_bucket(5m, timestamp) AS bucket,
avg(value), min(value), max(value)
FROM pp.tm_tag_point
WHERE tag_id = 'TAG-001'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket(5m, timestamp);
空区間を埋めてグラフに穴を作らない
SELECT time_bucket_gapfill(10m, timestamp, '2026-07-01', '2026-07-01 06:00'),
interpolate(avg(value))
FROM pp.tm_tag_point
WHERE tag_id = 'TAG-001'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-01 06:00'
GROUP BY tag_id, time_bucket_gapfill(10m, timestamp, '2026-07-01', '2026-07-01 06:00');
locf は直前の値の保持 (ステップ)、interpolate は線形補間 (直線) です。
設備の状態値のように「次の変化までそのまま」の信号は locf、温度のような連続する物理量は
interpolate が適しています。
生産量カウンタの毎時増加率
SELECT time_bucket(1h, timestamp) AS bucket,
counter_rate(value, timestamp) * 3600 AS per_hour
FROM pp.tm_tag_point
WHERE tag_id = 'COUNTER-01'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket(1h, timestamp);
応答遅延の p95
SELECT time_bucket(1h, timestamp), percentile(value, 0.95)
FROM pp.tm_tag_point
WHERE tag_id = 'LATENCY-01'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-02'
GROUP BY tag_id, time_bucket(1h, timestamp);
2つのタグの相関を見る
SELECT corr(a.value, b.value)
FROM pp.tm_tag_point_pair
WHERE pair_id = 'TEMP-VS-POWER'
AND timestamp >= '2026-07-01' AND timestamp < '2026-07-08';
知っておくべきこと
- 関数はパーティションを絞り込んでから使用してください。
WHEREにパーティションキー (通常tag_id) と時間範囲を 指定することが前提です — それなしで使うと全ノードを走査することになります。 GROUP BYにはパーティションキーとバケット関数を一緒に記述します (GROUP BY tag_id, time_bucket(...))。- ギャップフィルの
시작·끝はWHEREの時間範囲と一致している必要があります。異なると意図しない区間まで バケットが生成されます。
関連項目
- CQL でクエリする — 接続と基本構文
- 階層型ストレージ — 圧縮された過去データも同じクエリで読み取れます