文档文档

在查询中计算百分比

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

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

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

计算百分比

了解如何使用以下示例计算百分比

查询中的基本计算

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

  1. 指定要从中查询的 bucket(存储桶) 和要查询的时间范围。
  2. 按 measurements(测量)、fields(字段)和其他适用条件过滤您的数据。
  3. 通过使用以下函数之一,对齐一行中的值(在 Flux 中执行数学运算是必需的)

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

注意: 在此示例中,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 允许您执行简单的数学方程式,这使得使用 measurement(测量)中的两个字段计算百分比非常简单。但是,您需要注意一些注意事项。

查询中的基本计算

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)

示例

示例数据

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

  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 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、近实时数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、读取副本、增强的安全性以及数据压缩,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看