InfluxQL は SELECT 文で基本的な算術演算子をサポートしているため、フィールド値から直接パーセンテージを計算できます。
基本的な算術演算子
SELECT 文は +、-、*、/、() をサポートしています。これらの演算子を使用して、フィールドキー間でインライン計算を実行します。
-- 2 つのフィールドキーを追加
SELECT field_key1 + field_key2 AS "field_key_sum"
FROM "measurement_name"
WHERE time < now() - 15m
-- あるフィールドキーから別のフィールドキーを減算
SELECT field_key1 - field_key2 AS "field_key_difference"
FROM "measurement_name"
WHERE time < now() - 15m
-- 計算のグループ化と連鎖
SELECT (field_key1 + field_key2) - (field_key3 + field_key4) AS "some_calculation"
FROM "measurement_name"
WHERE time < now() - 15mパーセンテージの計算
あるフィールドを別のフィールドで割り、100 を掛けます:
SELECT (field_key1 / field_key2) * 100 AS "calculated_percentage"
FROM "measurement_name"
WHERE time < now() - 15m集計関数を使用したパーセンテージの計算
クエリを作成する前に、以下の要件にご注意ください:
すべてのフィールドで集計関数を使用する必要があります。集計フィールドと非集計フィールドを同じクエリに混在させることはできません。
各集計関数には、データポイントをグループ化するための時間間隔を定義する
GROUP BY time()句が必要です。WHERE句で時間範囲を指定してください。指定しない場合、集計関数が大量の計算リソースを消費する可能性があります。
SELECT (sum(field_key1) / sum(field_key2)) * 100 AS "calculated_percentage"
FROM "measurement_name"
WHERE time < now() - 15m
GROUP BY time(1m)例
以下の例では、1 日を通してさまざまなリンゴの品種が入ったバスケットの重量を追跡する、Apple Stand のサンプルデータを使用します。
サンプルデータの設定
サンプルデータをインポートします:
influx -ssl -username <Username> -password <Password> -host <Domain name> -port 3242 -import -path=path/to/apple_stand.txt -database=apple_stand
リンゴの品種ごとの総重量に対するパーセンテージの計算
次のクエリは、各データポイントにおける総重量に対する各リンゴ品種の割合を計算します:
SELECT
("braeburn" / total_weight) * 100,
("granny_smith" / total_weight) * 100,
("golden_delicious" / total_weight) * 100,
("fuji" / total_weight) * 100,
("gala" / total_weight) * 100
FROM "apple_stand"."autogen"."variety"リンゴの品種ごとの集計パーセンテージの計算
次のクエリは、1 時間間隔でグループ化された平均総重量に対する各品種の割合を計算します:
SELECT
(mean("braeburn") / mean(total_weight)) * 100,
(mean("granny_smith") / mean(total_weight)) * 100,
(mean("golden_delicious") / mean(total_weight)) * 100,
(mean("fuji") / mean(total_weight)) * 100,
(mean("gala") / mean(total_weight)) * 100
FROM "apple_stand"."autogen"."variety"
WHERE time >= '2018-06-18T12:00:00Z' AND time <= '2018-06-19T04:35:00Z'
GROUP BY time(1h)すべてのフィールドで mean() を使用して、集計のみという要件を満たしています。GROUP BY time(1h) 句はデータを 1 時間のブロックにグループ化し、WHERE 句の時間範囲はスキャンを特定のウィンドウに制限します。