TL;DR InfluxDB 技术提示 - 消除查询结果中的空白字段值 & 更多!
作者:Regan Kuchan / 产品, 开发者
2 月 16 日, 2017
导航到
在本周的帖子中,我们回顾了最有趣的 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 如何帮助他们取得成功的故事。 提交您的客户评价,即可获得限量版连帽衫作为感谢。