以下の関数は、timeSeries*() 系の集約関数
(timeSeriesInstantRateToGrid、
timeSeriesLastToGrid など) と組み合わせて使用することを想定しています。
seriesDecomposeSTL
導入バージョン: v24.1
STL (Seasonal-Trend Decomposition Procedure Based on Loess) を用いて時系列データを分解し、季節成分・トレンド成分・残差成分に分けます。
構文
seriesDecomposeSTL(series, period)
引数
返される値
4 つの配列から構成される配列を返します。1 つ目の配列は季節性成分、2 つ目の配列はトレンド成分、3 つ目の配列は残差成分、4 つ目の配列はベースライン(季節性 + トレンド)成分です。Array(Array(Float32), Array(Float32), Array(Float32), Array(Float32))
例
STL を使用して時系列データを分解する
SELECT seriesDecomposeSTL([10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34], 3) AS print_0
┌───────────print_0──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [[
-13.529999, -3.1799996, 16.71, -13.53, -3.1799996, 16.71, -13.53, -3.1799996,
16.71, -13.530001, -3.18, 16.710001, -13.530001, -3.1800003, 16.710001, -13.530001,
-3.1800003, 16.710001, -13.530001, -3.1799994, 16.71, -13.529999, -3.1799994, 16.709997
],
[
23.63, 23.63, 23.630003, 23.630001, 23.630001, 23.630001, 23.630001, 23.630001,
23.630001, 23.630001, 23.630001, 23.63, 23.630001, 23.630001, 23.63, 23.630001,
23.630001, 23.63, 23.630001, 23.630001, 23.630001, 23.630001, 23.630001, 23.630003
],
[
0, 0.0000019073486, -0.0000019073486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.0000019073486, 0,
0
],
[
10.1, 20.449999, 40.340004, 10.100001, 20.45, 40.34, 10.100001, 20.45, 40.34, 10.1, 20.45, 40.34,
10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.100002, 20.45, 40.34
]] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
seriesOutliersDetectTukey
導入バージョン: v24.2
Tukey Fences を使用して時系列データにおける外れ値を検出します。
構文
seriesOutliersDetectTukey(series[, min_percentile, max_percentile, K])
引数
series — 数値の配列。Array((UInt8/16/32/64)) または Array(Float*)
min_percentile — オプション。四分位範囲 (IQR) を計算するために使用される最小パーセンタイル値。値は [0.02,0.98] の範囲でなければなりません。デフォルトは 0.25 です。Float*
max_percentile — オプション。四分位範囲 (IQR) を計算するために使用される最大パーセンタイル値。値は [0.02,0.98] の範囲でなければなりません。デフォルトは 0.75 です。Float*
K — オプション。軽度またはより強い外れ値を検出するための非負の定数値。デフォルト値は 1.5 です。Float*
戻り値
入力配列と同じ長さの配列を返します。各値は、系列内の対応する要素に対する異常度スコアを表します。0 以外のスコアは異常の可能性を示します。Array(Float32)
使用例
基本的な外れ値検出
SELECT seriesOutliersDetectTukey([-3, 2, 15, 3, 5, 6, 4, 5, 12, 45, 12, 3, 3, 4, 5, 6]) AS print_0
┌───────────print_0─────────────────┐
│[0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0] │
└───────────────────────────────────┘
カスタムパラメータを用いた外れ値検出
SELECT seriesOutliersDetectTukey([-3, 2, 15, 3, 5, 6, 4.50, 5, 12, 45, 12, 3.40, 3, 4, 5, 6], 0.2, 0.8, 1.5) AS print_0
┌─print_0──────────────────────────────┐
│ [0,0,0,0,0,0,0,0,0,19.5,0,0,0,0,0,0] │
└──────────────────────────────────────┘
seriesPeriodDetectFFT
導入: v23.12
FFT(高速フーリエ変換)を使用して、指定された時系列データの周期を検出します。
構文
seriesPeriodDetectFFT(series)
引数
戻り値
系列データの周期に等しい実数値を返します。データポイント数が 4 未満の場合は NaN を返します。Float64
例
単純なパターンによる周期検出
SELECT seriesPeriodDetectFFT([1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6]) AS print_0
┌───────────print_0──────┐
│ 3 │
└────────────────────────┘
複雑なパターンを用いた周期検出
SELECT seriesPeriodDetectFFT(arrayMap(x -> abs((x % 6) - 3), range(1000))) AS print_0
┌─print_0─┐
│ 6 │
└─────────┘
timeSeriesCopyTag
導入バージョン: v26.1
指定したタグを、あるタググループ(src_group)から別のタググループ(dest_group)へコピーします。
この関数は、dest_group 内にすでに存在するコピー対象タグの値を置き換えます。
コピー対象のタグが src_group に存在しない場合、この関数は dest_group からもそのタグを削除します。
この関数は Prometheus の
group left/group right 修飾子におけるコピー処理ロジックを模倣します。
構文
timeSeriesCopyTag(dest_group, src_group, tag_to_copy)
引数
dest_group — コピー先のタググループ。UInt64
src_group — コピー元のタググループ。UInt64
tag_to_copy — コピーするタグの名前。String
返される値
dest_group に含まれるタグに、src_group からコピーされたタグを加えたタググループを返します。UInt64
使用例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS dest_group,
timeSeriesTagsToGroup([('code', '404'), ('message', 'Page not found')], '__name__', 'http_codes') AS src_group,
timeSeriesCopyTag(dest_group, src_group, '__name__') AS result_group,
timeSeriesGroupToTags(result_group)
┌─dest_group─┬─src_group─┬─result_group─┬─timeSeriesGroupToTags(result_group)────────────────────────┐
│ 1 │ 2 │ 3 │ [('__name__','http_codes'),('code','404'),('region','eu')] │
└────────────┴───────────┴──────────────┴────────────────────────────────────────────────────────────┘
導入バージョン: v26.1
指定したタグを、あるタググループ(src_group)から別のタググループ(dest_group)へコピーします。
この関数は、dest_group 内にあるコピー対象タグの既存の値をすべて置き換えます。
コピー対象タグの一部が src_group に存在しない場合、そのタグは dest_group からも削除されます。
この関数は、Prometheus の
group left/group right 修飾子におけるコピー処理のロジックを模倣します。
構文
timeSeriesCopyTags(dest_group, src_group, tags_to_copy)
引数
戻り値
dest_group に含まれるタグに、src_group からコピーしたタグを加えたタググループを表す値を返します。UInt64
例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS dest_group,
timeSeriesTagsToGroup([('code', '404'), ('message', 'Page not found')], '__name__', 'http_codes') AS src_group,
timeSeriesCopyTags(dest_group, src_group, ['__name__', 'code', 'env']) AS result_group,
timeSeriesGroupToTags(result_group)
┌─dest_group─┬─src_group─┬─result_group─┬─timeSeriesGroupToTags(result_group)────────────────────────┐
│ 1 │ 2 │ 3 │ [('__name__','http_codes'),('code','404'),('region','eu')] │
└────────────┴───────────┴──────────────┴────────────────────────────────────────────────────────────┘
導入バージョン: v26.1
グループから指定したタグの値を抽出します。存在しない場合は NULL を返します。
timeSeriesGroupToTags() 関数も参照してください。
構文
timeSeriesExtractTag(group)
引数
group — タグのグループ。UInt64
tag_to_extract — グループから抽出する対象タグの名前。String
戻り値
指定したタグの値を返します。Nullable(String)
使用例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group,
timeSeriesExtractTag(group, '__name__'),
timeSeriesExtractTag(group, 'env'),
timeSeriesExtractTag(group, 'instance')
┌─group─┬─timeSeriesExtractTag(group, '__name__')─┬─timeSeriesExtractTag(group, 'env')─┬─timeSeriesExtractTag(group, 'instance')─┐
│ 1 │ http_requests_count │ dev │ ᴺᵁᴸᴸ │
└───────┴─────────────────────────────────────────┴────────────────────────────────────┴─────────────────────────────────────────┘
timeSeriesFromGrid
導入バージョン: v25.8
値の配列 [x1, x2, x3, ...] をタプルの配列
[(start_timestamp, x1), (start_timestamp + step, x2), (start_timestamp + 2 * step, x3), ...] に変換します。
現在のタイムスタンプに step を加算していき、end_timestamp を超えるまで増加させます。
値の数がタイムスタンプの数と一致しない場合、関数は例外をスローします。
[x1, x2, x3, ...] 内の NULL 値はスキップされますが、現在のタイムスタンプは引き続き増加します。
例えば、[value1, NULL, x2] に対して、この関数は [(start_timestamp, x1), (start_timestamp + 2 * step, x2)] を返します。
構文
timeSeriesFromGrid(start_timestamp, end_timestamp, step, values)
引数
戻り値
start_timestamp と step で記述される等間隔の時間グリッド上のタイムスタンプと組み合わせて、元の値配列からの値を返します。Array(Tuple(DateTime64, Float64))
例
使用例
SELECT timeSeriesFromGrid('2025-06-01 00:00:00'::DateTime64(3), '2025-06-01 00:01:30.000'::DateTime64(3), 30, [10, 20, NULL, 30]) AS result;
┌─────────────────────────────────────────────result─────────────────────────────────────────────┐
│ [('2025-06-01 00:00:00.000',10),('2025-06-01 00:00:30.000',20),('2025-06-01 00:01:30.000',30)] │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
導入バージョン: v26.1
指定したグループに関連付けられているタグの名前および値を返します。
関数 timeSeriesTagsToGroup() も参照してください。
構文
timeSeriesGroupToTags(group)
エイリアス: timeSeriesTagsGroupToTags
引数
返り値
ペア (tag_name, tag_value) の配列を返します。
返される配列は常に tag_name でソートされており、同じ tag_name が複数回含まれることはありません。
Array(Tuple(String, String))
使用例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group,
timeSeriesGroupToTags(group) AS sorted_tags,
timeSeriesTagsToGroup(sorted_tags) AS same_group,
throwIf(same_group != group)
┌─group─┬─sorted_tags────────────────────────────────────────────────────────┬─same_group─┬─throwIf(notE⋯up, group))─┐
│ 1 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │ 1 │ 0 │
└───────┴────────────────────────────────────────────────────────────────────┴────────────┴──────────────────────────┘
timeSeriesIdToGroup
導入バージョン: v26.1
指定した時系列 ID に関連付けられたタグの名前と値を返します。
関数 timeSeriesStoreTags() も参照してください。
構文
別名: timeSeriesIdToTagsGroup
引数
戻り値
時系列の識別子 id に関連付けられたタグのグループを返します。型は UInt64 です。
使用例
例
SELECT 8374283493092 AS id,
timeSeriesStoreTags(id, [('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS same_id,
throwIf(same_id != id),
timeSeriesIdToGroup(same_id) AS group,
timeSeriesGroupToTags(group)
┌────────────id─┬───────same_id─┬─throwIf(notE⋯me_id, id))─┬─group─┬─timeSeriesGroupToTags(group)───────────────────────────────────────┐
│ 8374283493092 │ 8374283493092 │ 0 │ 1 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │
└───────────────┴───────────────┴──────────────────────────┴───────┴────────────────────────────────────────────────────────────────────┘
導入: v25.8
指定した時系列識別子に対応するタグを返します。
timeSeriesStoreTags() 関数も参照してください。
構文
引数
返される値
(tag_name, tag_value) のペアの配列を返します。
返される配列は常に tag_name によってソートされ、同じ tag_name が重複して含まれることはありません。
Array(Tuple(String, String))
使用例
例
SELECT 8374283493092 AS id,
timeSeriesStoreTags(id, [('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS same_id,
throwIf(same_id != id),
timeSeriesIdToTags(same_id)
┌────────────id─┬───────same_id─┬─throwIf(notE⋯me_id, id))─┬─timeSeriesIdToTags(same_id)────────────────────────────────────────┐
│ 8374283493092 │ 8374283493092 │ 0 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │
└───────────────┴───────────────┴──────────────────────────┴────────────────────────────────────────────────────────────────────┘
導入バージョン: v26.1
タググループから抽出した、指定したタグの値を結合します。
この関数は、結合した値の間にセパレータを挿入し、タグ dest_tag に結合後の値が設定された新しいタググループを返します。
この関数は、Prometheus の関数
label_join()
のロジックを模倣します。
構文
timeSeriesJoinTags(group, dest_tag, separator, src_tags)
引数
戻り値
dest_tag タグに結合結果が設定された新しいタググループを返します。UInt64
使用例
例
SELECT timeSeriesTagsToGroup([('__name__', 'up'), ('job', 'api-server'), ('src1', 'a'), ('src2', 'b'), ('src3', 'c')]) AS group,
timeSeriesJoinTags(group, 'foo', ',', ['src1', 'src2', 'src3']) AS result_group,
timeSeriesGroupToTags(result_group)
┌─group─┬─result_group─┬─timeSeriesGroupToTags(result_group)─────────────────────────────────────────────────────────────┐
│ 1 │ 2 │ [('__name__','up'),('foo','a,b,c'),('job','api-server'),('src1','a'),('src2','b'),('src3','c')] │
└───────┴──────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────┘
timeSeriesRange
導入バージョン: v25.8
タイムスタンプの範囲 [start_timestamp, start_timestamp + step, start_timestamp + 2 * step, ..., end_timestamp] を生成します。
start_timestamp が end_timestamp と等しい場合、この関数は [start_timestamp] を含む 1 要素の配列を返します。
timeSeriesRange() 関数は range 関数と類似しています。
構文
timeSeriesRange(start_timestamp, end_timestamp, step)
引数
戻り値
タイムスタンプの範囲を返します。Array(DateTime64)
例
使用例
SELECT timeSeriesRange('2025-06-01 00:00:00'::DateTime64(3), '2025-06-01 00:01:00'::DateTime64(3), 30)
┌────────────────────────────────────result─────────────────────────────────────────┐
│ ['2025-06-01 00:00:00.000', '2025-06-01 00:00:30.000', '2025-06-01 00:01:00.000'] │
└───────────────────────────────────────────────────────────────────────────────────┘
導入バージョン: v26.1
タググループから、指定したタグ以外のすべてのタグを削除します。
関数 timeSeriesRemoveTag()、
timeSeriesRemoveTags() も参照してください。
構文
timeSeriesRemoveAllTagsExcept(group, tags_to_keep)
引数
戻り値
指定したタグのみを保持した新しいタググループ。UInt64
例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group,
timeSeriesRemoveAllTagsExcept(group, ['env']) AS result_group,
timeSeriesGroupToTags(result_group)
┌─group─┬─result_group─┬─timeSeriesGroupToTags(result_group)─┐
│ 1 │ 2 │ [('env','dev')] │
└───────┴──────────────┴─────────────────────────────────────┘
timeSeriesRemoveTag
導入バージョン: v26.1
指定したタグをタググループから削除します。
グループ内にそのタグが存在しない場合、グループは変更されずに返されます。
関数 timeSeriesRemoveTags(),
timeSeriesRemoveAllTagsExcept() も参照してください。
構文
timeSeriesRemoveTag(group, tag_to_remove)
引数
group — タグのグループ。UInt64
tag_to_remove — グループから削除するタグの名前。String
戻り値
指定したタグを除いた新しいタグのグループ。UInt64
使用例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group_of_3,
timeSeriesRemoveTag(group_of_3, '__name__') AS group_of_2,
timeSeriesGroupToTags(group_of_2),
timeSeriesRemoveTag(group_of_2, 'env') AS group_of_1,
timeSeriesGroupToTags(group_of_1),
timeSeriesRemoveTag(group_of_1, 'region') AS empty_group,
timeSeriesGroupToTags(empty_group)
┌─group_of_3─┬─group_of_2─┬─timeSeriesGroupToTags(group_of_2)─┬─group_of_1─┬─timeSeriesGroupToTags(group_of_1)─┬─empty_group─┬─timeSeriesGroupToTags(empty_group)─┐
│ 1 │ 2 │ [('env','dev'),('region','eu')] │ 3 │ [('region','eu')] │ 0 │ [] │
└────────────┴────────────┴───────────────────────────────────┴────────────┴───────────────────────────────────┴─────────────┴────────────────────────────────────┘
導入バージョン: v26.1
タグの集合から、指定されたタグを削除します。
指定されたタグの一部がタグの集合に存在しない場合、それらのタグは無視されます。
関数 timeSeriesRemoveTag()、
timeSeriesRemoveAllTagsExcept() も参照してください。
構文
timeSeriesRemoveTags(group, tags_to_remove)
引数
戻り値
指定されたタグを除いた新しいタグのグループ。UInt64
例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group_of_3,
timeSeriesRemoveTags(group_of_3, ['env', 'region']) AS group_of_1,
timeSeriesGroupToTags(group_of_1),
timeSeriesRemoveTags(group_of_1, ['__name__', 'nonexistent']) AS empty_group,
timeSeriesGroupToTags(empty_group)
┌─group_of_3─┬─group_of_1─┬─timeSeriesGroupToTags(group_of_1)────┬─empty_group─┬─timeSeriesGroupToTags(empty_group)─┐
│ 1 │ 2 │ [('__name__','http_requests_count')] │ 0 │ [] │
└────────────┴────────────┴──────────────────────────────────────┴─────────────┴────────────────────────────────────┘
timeSeriesReplaceTag
導入バージョン: v26.1
タグ src_tag の値に対して正規表現 regex を適用して照合します。
マッチした場合、返されるグループ内のタグ dest_tag の値は、
入力に含まれていた元のタグに、replacement を展開した結果を加えたものになります。
この関数は Prometheus の関数
label_replace()
と同様のロジックで動作します。
構文
timeSeriesReplaceTag(group, dest_tag, replacement, src_tag, regex)
引数
group — タグのグループ。UInt64
dest_tag — 結果を格納する宛先タグの名前。String
replacement — 置換パターン。正規表現 'regex' 内のキャプチャグループを参照するために 1、2、または $name を含めることができます。String
src_tag — その値が正規表現 'regex' と照合されるタグの名前。String
regex — 正規表現。String
戻り値
dest_tag が追加されている可能性のある新しいタグのグループ。UInt64
使用例
例
SELECT timeSeriesTagsToGroup([('__name__', 'up'), ('job', 'api-server'), ('service', 'a:c')]) AS group,
timeSeriesReplaceTag(group, 'foo', '$1', 'service', '(.*):.*') AS result_group,
timeSeriesGroupToTags(result_group)
┌─group─┬─result_group─┬─timeSeriesGroupToTags(result_group)────────────────────────────────────┐
│ 1 │ 2 │ [('__name__','up'),('foo','a'),('job','api-server'),('service','a:c')] │
└───────┴──────────────┴────────────────────────────────────────────────────────────────────────┘
導入: v25.8
クエリコンテキスト内に、タイムシリーズの指定された識別子とタグのセットとの対応付けを保存します。
timeSeriesIdToTags()
および timeSeriesIdToGroup()
関数を使用して、クエリ実行中に後からこの対応付けにアクセスできます。
構文
timeSeriesStoreTags(id, tags_array, separate_tag_name_1, separate_tag_value_1, ...)
引数
返される値
時系列の識別子を返します(つまり、最初の引数をそのまま返します)。
使用例
例
SELECT 8374283493092 AS id,
timeSeriesStoreTags(id, [('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS same_id,
throwIf(same_id != id),
timeSeriesIdToTags(same_id),
timeSeriesGroupToTags(timeSeriesIdToGroup(same_id))
┌────────────id─┬───────same_id─┬─throwIf(notEquals(same_id, id))─┬─timeSeriesIdToTags(same_id)────────────────────────────────────────┬─timeSeriesGroupToTags(timeSeriesIdToGroup(same_id))────────────────┐
│ 8374283493092 │ 8374283493092 │ 0 │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │ [('__name__','http_requests_count'),('env','dev'),('region','eu')] │
└───────────────┴───────────────┴─────────────────────────────────┴────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────┘
導入バージョン: v26.1
指定したタグに対応するタググループを返します。
同じタググループがクエリ実行中に複数回見つかった場合、この関数は同じグループを返します。
タグの空集合に対しては、この関数は常に 0 を返します。
関数 timeSeriesGroupToTags() も参照してください。
構文
timeSeriesTagsToGroup(tags_array, tag_name_1, tag_value_1, tag_name2, tag_value2, ...)
引数
戻り値
指定されたタグに関連付けられたタグのグループを返します。UInt64
使用例
例
SELECT timeSeriesTagsToGroup([('region', 'eu'), ('env', 'dev')], '__name__', 'http_requests_count') AS group1,
timeSeriesTagsToGroup([], '__name__', 'http_failures') AS group2,
timeSeriesTagsToGroup([]) AS empty_group,
timeSeriesTagsToGroup([], '__name__', 'http_failures') AS same_group2,
throwIf(same_group2 != group2),
timeSeriesGroupToTags(group2)
┌─group1─┬─group2─┬─empty_group─┬─same_group2─┬─throwIf(notEquals(same_group2, group2))─┬─timeSeriesGroupToTags(group2)──┐
│ 1 │ 2 │ 0 │ 2 │ 0 │ [('__name__','http_failures')] │
└────────┴────────┴─────────────┴─────────────┴─────────────────────────────────────────┴────────────────────────────────┘