在查询中计算百分比
此页面记录了早期版本的 InfluxDB OSS。InfluxDB OSS v2 是最新的稳定版本。请参阅等效的 InfluxDB v2 文档: 使用 Flux 计算百分比。
使用 Flux 或 InfluxQL 在查询中计算百分比。
Flux 允许您执行简单的数学方程式,例如,计算百分比。
计算百分比
了解如何使用以下示例计算百分比
查询中的基本计算
在 Flux 查询中执行任何数学运算时,您必须完成以下步骤
- 指定要从中查询的 bucket(存储桶) 和要查询的时间范围。
- 按 measurements(测量)、fields(字段)和其他适用的条件过滤您的数据。
- 通过使用以下函数之一,对齐一行中的值(在 Flux 中执行数学运算是必需的)
- 要从多个数据源查询,请使用
join()
函数。 - 要从同一数据源查询,请使用
pivot()
函数。
- 要从多个数据源查询,请使用
有关使用 join()
函数计算百分比的示例以及更多计算百分比的示例,请参阅 使用 Flux 计算百分比。
数据变量
为了缩短示例,我们将基本 Flux 查询存储在 data
变量中以供重用。
以下是在 Flux 中的外观
// Query data from the past 15 minutes pivot fields into columns so each row
// contains values for each field
data = from(bucket:"your_db/your_retention_policy")
|> range(start: -15m)
|> filter(fn: (r) => r._measurement == "measurement_name" and r._field =~ /field[1-2]/)
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
现在,每行都包含执行数学运算所需的值。 例如,要添加两个字段键,请从上面创建的 data
变量开始,然后使用 map()
重新映射每行中的值。
data
|> map(fn: (r) => ({ r with _value: r.field1 + r.field2}))
注意: Flux 支持基本的数学运算符,例如
+
、-
、/
、*
和()
。 例如,要从field1
中减去field2
,请将+
更改为-
。
从两个字段计算百分比
使用上面创建的 data
变量,然后使用 map()
函数 将一个字段除以另一个字段,乘以 100,并添加一个新的 percent
字段以存储百分比值。
data
|> map(fn: (r) => ({
_time: r._time,
_measurement: r._measurement,
_field: "percent",
_value: field1 / field2 * 100.0
}))
注意: 在此示例中,
field1
和field2
是浮点值,因此乘以 100.0。 对于整数值,乘以 100 或使用float()
函数将整数转换为浮点数。
使用聚合函数计算百分比
使用 aggregateWindow()
按时间窗口化数据,并在每个窗口上执行聚合函数。
from(bucket:"<database>/<retention_policy>")
|> range(start: -15m)
|> filter(fn: (r) => r._measurement == "measurement_name" and r._field =~ /fieldkey[1-2]/)
|> aggregateWindow(every: 1m, fn:sum)
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(fn: (r) => ({ r with _value: r.field1 / r.field2 * 100.0 }))
计算每种苹果品种的总重量百分比
使用模拟的苹果摊位数据来跟踪苹果(按类型)在一整天中的重量。
- 下载示例数据
- 导入示例数据
influx -import -path=path/to/apple_stand.txt -precision=ns -database=apple_stand
使用以下查询来计算在每个给定时间点,每种品种占总重量的百分比。
from(bucket:"apple_stand/autogen")
|> range(start: 2018-06-18T12:00:00Z, stop: 2018-06-19T04:35:00Z)
|> filter(fn: (r) => r._measurement == "variety")
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(fn: (r) => ({ r with
granny_smith: r.granny_smith / r.total_weight * 100.0 ,
golden_delicious: r.golden_delicious / r.total_weight * 100.0 ,
fuji: r.fuji / r.total_weight * 100.0 ,
gala: r.gala / r.total_weight * 100.0 ,
braeburn: r.braeburn / r.total_weight * 100.0 ,}))
计算每小时每种品种的平均总重量百分比
使用先前示例中的苹果摊位数据,使用以下查询来计算每小时每种品种占总重量的平均百分比。
from(bucket:"apple_stand/autogen")
|> range(start: 2018-06-18T00:00:00.00Z, stop: 2018-06-19T16:35:00.00Z)
|> filter(fn: (r) => r._measurement == "variety")
|> aggregateWindow(every:1h, fn: mean)
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(fn: (r) => ({ r with
granny_smith: r.granny_smith / r.total_weight * 100.0,
golden_delicious: r.golden_delicious / r.total_weight * 100.0,
fuji: r.fuji / r.total_weight * 100.0,
gala: r.gala / r.total_weight * 100.0,
braeburn: r.braeburn / r.total_weight * 100.0
}))
InfluxQL 允许您执行简单的数学方程式,这使得使用测量中的两个字段计算百分比非常简单。 但是,您需要注意一些注意事项。
查询中的基本计算
SELECT
语句支持使用基本的数学运算符,例如 +
、-
、/
、*
、()
等。
-- Add two field keys
SELECT field_key1 + field_key2 AS "field_key_sum" FROM "measurement_name" WHERE time < now() - 15m
-- Subtract one field from another
SELECT field_key1 - field_key2 AS "field_key_difference" FROM "measurement_name" WHERE time < now() - 15m
-- Grouping and chaining mathematical calculations
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()
子句,以定义数据点分组和聚合的时间间隔。
SELECT (sum(field_key1) / sum(field_key2)) * 100 AS "calculated_percentage" FROM "measurement_name" WHERE time < now() - 15m GROUP BY time(1m)
示例
示例数据
以下示例使用模拟的苹果摊位数据,该数据跟踪一天营业中不同品种的苹果篮子的重量。
- 下载示例数据
- 导入示例数据
influx -import -path=path/to/apple_stand.txt -precision=ns -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"
如果可视化为 Chronograf 中的 堆叠图,它将看起来像
计算每种品种的聚合百分比
以下查询计算每小时每种品种占总重量的平均百分比。
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()
子句,该子句将数据聚合到 1 小时的时间块中。 - 它包括一个显式限制的时间窗口。 如果没有它,聚合函数将非常消耗资源。
如果可视化为 Chronograf 中的 堆叠图,它将看起来像
此页内容对您有帮助吗?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子! 我们欢迎并鼓励您提供关于 InfluxDB 和此文档的反馈和错误报告。 要查找支持,请使用以下资源
拥有年度或支持合同的客户 可以联系 InfluxData 支持。