TL;DR InfluxDB技术提示 - 在查询结果中消除空白字段值以及更多!
由 Regan Kuchan / 产品,开发者
2017年2月16日
导航至
在本周的文章中,我们回顾了InfluxDB空白值和TICK-stack相关的问题、解决方案、如何操作以及Q&A,这些内容来自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
A:是的!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() 值之间经过的时间
Q:我想知道一个 测量 中第一个和最后一个值之间的经过时间,并按单个 标签键 进行分组。当我运行下面的查询时,系统会覆盖第一个和最后一个值相关的时间戳,我甚至无法使用 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
A:虽然需要几个步骤,但有一种方法可以使用 InfluxQL 获取您想要的信息。
以下代码块中的操作分为三个主要步骤。第一个查询将 FIRST()
函数的结果写入一个新的测量和字段键。第二个查询将 LAST()
函数的结果写入相同的测量和 字段键。最后一个查询使用第一个和第二个查询的结果计算经过的时间。
# 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()
Q:我想计算字段中 MIN()
和 MAX()
值之间差值的 SUM()
。当我运行下面的查询时,我遇到了解析错误,经过进一步调查,似乎 InfluxQL 不支持 SUM()
的嵌套。您知道如何解决这个问题吗?
> SELECT SUM(MAX("heart_rate")-MIN("heart_rate")) FROM "health" GROUP BY "id" ERR: error parsing query: expected field argument in sum()
A:从 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,包含用于部署、监控和平衡集群的直观界面,以及管理备份和恢复。
- 分享您的故事:300 多家公司 已分享了他们的故事,讲述了 InfluxDB 如何帮助他们成功。提交您的感言,并获得限量版卫衣作为感谢。