Documentation

在查询中计算百分比

本页面记录了 InfluxDB OSS 的早期版本。InfluxDB OSS v2 是最新的稳定版本。请参阅等效的 InfluxDB v2 文档: 使用 Flux 计算百分比

使用 Flux 或 InfluxQL 在查询中计算百分比。

Flux 允许你执行简单的数学方程,例如,计算百分比。

计算百分比

学习如何计算一个百分比,使用以下例子:

查询中的基本计算

在Flux查询中执行任何数学操作时,您必须完成以下步骤:

  1. 指定要查询的 bucket 和查询的时间范围。
  2. 通过测量、字段和其他适用标准过滤您的数据。
  3. 通过使用以下函数,将值对齐到一行(在Flux中进行数学运算时是必需的):

有关使用 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
  }))

注意: 在这个例子中,field1field2 是浮点值,因此乘以 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 }))

计算每种苹果品种的总重量百分比

使用模拟的苹果摊位数据来跟踪一天内苹果的重量(按类型)。

  1. 下载样本数据
  2. 导入示例数据:
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)

示例

示例数据

以下示例使用模拟的苹果摊数据,该数据跟踪在一天的营业中,包含不同品种苹果的篮子的重量。

  1. 下载示例数据
  2. 导入示例数据:
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中可视化为一个堆叠图,它看起来像:

Percentage of total per apple variety

计算每种品种的总百分比

以下查询计算每种品种每小时占总重量的平均百分比。

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中可视化为堆叠图,它将呈现如下:

Hourly average percentage of total per apple variety



Flux的未来

Flux 正在进入维护模式。您可以像现在一样继续使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看: