在计算中使用多个字段
要在数学计算中使用多个字段的值,请完成以下步骤:
按字段过滤
使用 filter()
仅返回计算所需的字段。
使用 or 逻辑运算符
按多个字段进行过滤。
以下示例查询两个字段, A 和 B:
from(bucket: "example-bucket")
|> range(start: -1m)
|> filter(fn: (r) => r._field == "A" or r._field == "B")
此查询为每个字段返回一个或多个表。例如:
| 时间 | 字段 | 值 |
|---|---|---|
| 2021-01-01T00:00:00Z | A | 12.4 |
| 2021-01-01T00:00:15Z | A | 12.2 |
| 2021-01-01T00:00:30Z | A | 11.6 |
| 2021-01-01T00:00:45Z | A | 11.9 |
| 时间 | 字段 | 值 |
|---|---|---|
| 2021-01-01T00:00:00Z | B | 3.1 |
| 2021-01-01T00:00:15Z | B | 4.8 |
| 2021-01-01T00:00:30Z | B | 2.2 |
| 2021-01-01T00:00:45Z | B | 3.3 |
将字段透视为列
使用 pivot() 来按时间对齐多个字段。
要正确地在 _time 上进行透视,每个字段的点必须具有相同的时间戳。
如果时间戳不规则或未完美对齐,请参阅
标准化不规则时间戳。
// ...
|> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
使用上述查询的数据 above,这个 pivot() 函数返回:
| 时间 | A | B |
|---|---|---|
| 2021年01月01日 00:00:00 UTC | 12.4 | 3.1 |
| 2021-01-01T00:00:15Z | 12.2 | 4.8 |
| 2021-01-01T00:00:30Z | 11.6 | 2.2 |
| 2021-01-01T00:00:45Z | 11.9 | 3.3 |
进行计算
使用 map() 执行数学运算,使用列值作为操作数。
以下示例使用 A 和 B 列中的值来计算一个新的 _value 列:
// ...
|> map(fn: (r) => ({ r with _value: r.A * r.B }))
使用上面的透视数据,这个 map() 函数返回:
| 时间 | A | B | 值 |
|---|---|---|---|
| 2021-01-01T00:00:00Z | 12.4 | 3.1 | 38.44 |
| 2021-01-01T00:00:15Z | 12.2 | 4.8 | 58.56 |
| 2021-01-01T00:00:30Z | 11.6 | 2.2 | 25.52 |
| 2021-01-01T00:00:45Z | 11.9 | 3.3 | 39.27 |
完整示例查询
from(bucket: "example-bucket")
|> range(start: -1m)
|> filter(fn: (r) => r._field == "A" or r._field == "B")
|> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(fn: (r) => ({r with _value: r.A * r.B}))