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

导航至

在本周的文章中,我们回顾了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 如何帮助他们成功。提交您的感言,并获得限量版卫衣作为感谢。