文档文档

在查询中计算百分比

此页面记录了早期版本的 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 允许您执行简单的数学方程式,这使得使用测量中的两个字段计算百分比非常简单。 但是,您需要注意一些注意事项。

查询中的基本计算

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 开源版本现已可用于 alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个产品作为 alpha 版本的一部分。

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

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