TL;DR InfluxDB 技术提示 - 消除查询结果中的空白字段值 & 更多!

导航到

在本周的帖子中,我们回顾了最有趣的 InfluxDB 空白值和 TICK-stack 相关问题、解决方法、操作指南以及来自 GitHub、IRC 和 InfluxDB Google Group 中您可能在过去一周左右错过的问答。

消除查询结果中的空白字段值

问:  我很高兴使用 GROUP BY time() 子句,但我注意到我的查询返回了很多带有空白字段值的结果。 看起来系统为查询时间范围内的每个 GROUP BY time() 间隔返回一个时间戳,无论该间隔是否有值。我正在处理不规则的时间序列数据 - 有没有办法绕过 GROUP BY time() 行为,只获取具有实际字段值的结果?

我的查询

> SELECT SUM("candied") FROM "hearts" \
WHERE time >= '2017-02-14T16:00:00Z' AND time <= '2017-02-14T22:00:00Z' \
GROUP BY time(1h)

name: hearts
time                  sum
----                  ---
2017-02-14T16:00:00Z  4
2017-02-14T17:00:00Z  12
2017-02-14T18:00:00Z      
2017-02-14T19:00:00Z      
2017-02-14T20:00:00Z       
2017-02-14T21:00:00Z      
2017-02-14T22:00:00Z  23

答: 有! InfluxQL 支持 fill(<fill_options>) ,它用相关的 fill_option 替换这些空白值。 其中一个选项是 none;带有 fill(none) 的查询不报告没有数据的时间间隔的时间戳和值。

> SELECT SUM("candied") FROM "hearts" \
WHERE time >= '2017-02-14T16:00:00Z' AND time <= '2017-02-14T22:00:00Z' \
GROUP BY time(1h) fill(none)

name: hearts
time                  sum
----                  ---
2017-02-14T16:00:00Z  4
2017-02-14T17:00:00Z  12
2017-02-14T22:00:00Z  23

其他 fill_options 包括用以下内容替换空白值:

  • 您选择的数值
  • 线性插值的结果
  • 来自上一个间隔的结果

查看文档中的 数据探索 页面以获取更多信息。

计算 FIRST() 和 LAST() 值之间经过的时间

问: 我想知道 measurement 中第一个和最后一个值之间经过的时间,按单个 标签键 分组。 当我运行下面的查询时,系统会覆盖与第一个和最后一个值相关联的时间戳,我甚至无法使用 ELAPSED() 函数 :(。 有什么关于如何获取我想要的信息的想法吗?

> SELECT FIRST("bouquets"),LAST("bouquets") FROM "flower_purchases" \
GROUP BY "store_id"

name: flower_purchases
tags: store_id=1
time                 first last
----                 ----- ----
1970-01-01T00:00:00Z 3     5

name: flower_purchases
tags: store_id=2
time                 first last
----                 ----- ----
1970-01-01T00:00:00Z 10    12

答: 解决方法需要几个步骤,但有一种方法可以使用 InfluxQL 获取您想要的信息。

在下面的代码块中,我们分三个主要步骤获得结果。 第一个查询将 FIRST() 函数 的结果写入新的 measurement 和字段键。 第二个查询将 LAST() 函数 的结果写入相同的 measurement 和字段键。 最后一个查询使用第一个和第二个查询的结果计算经过的时间。

# Step 1: Write the FIRST() values to the 
# for_elapsed measurement and first_lasts field key

> SELECT FIRST("bouquets") AS "first_lasts" INTO "for_elapsed" \
FROM "flower_purchases" GROUP BY "store_id"

name: result
time                 written
----                 -------
1970-01-01T00:00:00Z 2

> SELECT "first_lasts","store_id" FROM "for_elapsed"
name: for_elapsed
time                 first_lasts store_id
----                 ----------- --------
2017-02-14T22:00:00Z 3           1
2017-02-14T22:15:00Z 10          2

# Step 2: Write the LAST() values to the
# for_elapsed measurement and first_lasts field key

> SELECT LAST("bouquets") AS "first_lasts" INTO "for_elapsed" \
FROM "flower_purchases" GROUP BY "store_id"

name: result
time                 written
----                 -------
1970-01-01T00:00:00Z 2

> SELECT "first_lasts","store_id" FROM "for_elapsed"
name: for_elapsed
time                 first_lasts store_id
----                 ----------- --------
2017-02-14T22:00:00Z 3           1
2017-02-14T22:15:00Z 10          2
2017-02-14T22:30:00Z 5           1
2017-02-14T22:35:00Z 12          2

# Step 3: Calculate the ELAPSED() time on the data in the
# for_elapsed measurement and first_lasts field key

> SELECT ELAPSED("first_lasts",1m) FROM "for_elapsed" GROUP BY "store_id"

name: for_elapsed
tags: store_id=1
time                 elapsed
----                 -------
2017-02-14T22:30:00Z 30

name: for_elapsed
tags: store_id=2
time                 elapsed
----                 -------
2017-02-14T22:35:00Z 20

有关 INTO 子句 的更多信息,请参阅文档中的数据探索页面。

计算 MIN() 和 MAX() 值之间差值的 SUM()

问: 我想计算字段中 SUM() 和 MIN() 和 MAX() 值之间差值的总和。 当我运行下面的查询时,我收到一个解析错误,经过进一步调查,似乎 InfluxQL 不支持与 SUM() 嵌套。 您知道有什么方法可以解决这个问题吗?

> SELECT SUM(MAX("heart_rate")-MIN("heart_rate")) FROM "health" GROUP BY "id"
ERR: error parsing query: expected field argument in sum()

答:  从 InfluxDB 1.2 版本开始,InfluxQL 支持 子查询;子查询将为您提供您正在寻找的结果!

> SELECT SUM("difference") FROM \
(SELECT MAX("heart_rate") - MIN("heart_rate") \
AS "difference" FROM "health" GROUP BY "id")

name: health
time                 sum
----                 ---
1970-01-01T00:00:00Z 20

查看文档中的 数据探索 页面以获取更多信息。

下一步是什么

  • 下载 TICK-stack 的下载页面已上线。
  • 在云端部署: 开始免费试用 InfluxDB Cloud ,它具有完全托管的集群、Kapacitor 和 Grafana。
  • 在您的服务器上部署: 想在您的服务器上运行 InfluxDB 集群? 试用 InfluxDB Enterprise 的 14 天免费试用版 InfluxDB Enterprise ,它具有直观的 UI,用于部署、监控和重新平衡集群,以及管理备份和恢复。 
  • 讲述您的故事: 超过 300 家公司 分享了 InfluxDB 如何帮助他们取得成功的故事。 提交您的客户评价,即可获得限量版连帽衫作为感谢。