在查询中计算百分比
本页面记录了 InfluxDB OSS 的早期版本。InfluxDB OSS v2 是最新的稳定版本。请参阅等效的 InfluxDB v2 文档: 使用 Flux 计算百分比。
使用 Flux 或 InfluxQL 在查询中计算百分比。
Flux 允许你执行简单的数学方程,例如,计算百分比。
计算百分比
学习如何计算一个百分比,使用以下例子:
查询中的基本计算
在Flux查询中执行任何数学操作时,您必须完成以下步骤:
- 指定要查询的 bucket 和查询的时间范围。
- 通过测量、字段和其他适用标准过滤您的数据。
- 通过使用以下函数,将值对齐到一行(在Flux中进行数学运算时是必需的):
- 要从 多个 数据源查询,使用
join()函数。 - 要从 相同 数据源查询,使用
pivot()函数。
- 要从 多个 数据源查询,使用
有关使用 join() 函数计算百分比的示例以及更多计算百分比的示例,请参见 Calculate percentages with 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中可视化为堆叠图,它将呈现如下:
