TL;DR InfluxDB 技术提示 - 全面了解新的子查询!

导航至

在这篇博文中,我们将介绍子查询;InfluxDB 1.2 版本中的一项新的 InfluxQL 功能。请在下周查看更多关于 InfluxDB 和 TICK-stack 相关问题的有趣内容、解决方法、操作指南以及来自 GitHub、IRC 和 InfluxDB Google Group 的问答。

什么是子查询?

子查询是 InfluxDB 1.2 版本中的一项新功能。它们增强了 InfluxQL 查询的功能,并允许您更精细、更有意义地洞察您的数据。

子查询是嵌套在另一个查询的 FROM 子句中的查询。您可以将子查询视为充当单独查询中条件的查询。语法非常简单

SELECT_clause FROM (SELECT_statement) [...]

其中子查询是出现在主查询的 FROM 子句中的括号内的 SELECT_statement,而主查询是括号外的所有内容。子查询和主查询都支持每个 InfluxQL 子句。当系统执行查询时,它会运行子查询,然后在该子查询的结果上运行主查询。

我何时会使用子查询?

对函数的结果执行函数,再执行函数

对另一个函数的结果执行函数。此用例等效于嵌套函数。以下查询计算每个 subway 标签passengers平均值,并且仅返回最大平均值

> SELECT MAX("mean") FROM (SELECT MEAN("passengers") FROM "schedule" GROUP BY "subway")

name: schedule
time                  max
----                  ---
1970-01-01T00:00:00Z  32.75

请注意,主查询中的 SELECT 子句将 mean 指定为 MAX() 函数中的 字段键。为了理解 InfluxDB 如何计算这些结果,我们包含了仅来自子查询的(带注释的)输出,如下所示

> SELECT MEAN("passengers") FROM "schedule" GROUP BY "subway"

name: schedule
tags: subway=U2
time                  mean   <---- The relevant field key for the main query
----                  ----
1970-01-01T00:00:00Z  32.75  <---- This is the max value that gets returned

name: schedule
tags: subway=U6
time                  mean   <---- The relevant field key for the main query
----                  ----
1970-01-01T00:00:00Z  18

对另一个查询的结果执行额外的分析

子查询的另一个用途是对数学运算的结果执行函数。此用例等效于在函数内执行数学运算。以下查询计算每位 passengerspilled_coffee 数量,并返回这些商的平均值

> SELECT MEAN("spills_per_person") FROM (SELECT "spilled_coffee"/"passengers" AS "spills_per_person" FROM "schedule" GROUP BY "subway")

name: schedule
time                  mean
----                  ----
1970-01-01T00:00:00Z  0.13206144512134227

请注意,主查询中的 SELECT 子句将 spills_per_person 指定为 MEAN 函数中的字段键。为了理解 InfluxDB 如何计算这些结果,我们包含了仅来自子查询的(带注释的)输出,如下所示

> SELECT "spilled_coffee"/"passengers" AS "spills_per_person" FROM "schedule" GROUP BY "subway"
name: schedule
tags: subway=U2
time                  spills_per_person   <---- The relevant field key for the main query
----                  -----------------
2017-01-25T18:00:00Z  0.029411764705882353
2017-01-25T18:05:00Z  0.05555555555555555
2017-01-25T18:10:00Z  0.13333333333333333
2017-01-25T18:15:00Z  0.16129032258064516

name: schedule
tags: subway=U6
time                  spills_per_person   <---- The relevant field key for the main query
----                  -----------------
2017-01-25T18:00:00Z  0.2
2017-01-25T18:05:00Z  0.1111111111111111
2017-01-25T18:10:00Z  0.05
2017-01-25T18:15:00Z  0.3157894736842105

对另一个查询的结果设置特定条件

执行一个函数,并且仅返回满足特定条件的结果。此用例类似于 SQL 的 HAVING 子句。以下查询计算十分钟间隔内 passengers最小值,并且仅返回那些大于 15 的最小值

> SELECT "min" FROM (SELECT MIN("passengers") FROM "schedule" WHERE time >= '2017-01-25T18:00:00Z' AND time <= '2017-01-25T18:15:00Z' GROUP BY time(10m)) WHERE "min" > 15

name: schedule
time                  min
----                  ---
2017-01-25T18:10:00Z  19

请注意,主查询中的 SELECTWHERE 子句将 min 指定为感兴趣的字段键。为了理解 InfluxDB 如何计算这些结果,我们包含了仅来自子查询的(带注释的)输出,如下所示

> SELECT MIN("passengers") FROM "schedule" WHERE time >= '2017-01-25T18:00:00Z' AND time <= '2017-01-25T18:15:00Z' GROUP BY time(10m)

name: schedule
time                  min   <---- The relevant field key for the main query
----                  ---
2017-01-25T18:00:00Z  15
2017-01-25T18:10:00Z  19    <---- This is the only minimum value that gets returned

还有什么?

您可以在 数据探索页面上找到关于子查询的文档。这是我们在 InfluxQL 中首次实现子查询 - 如果您发现任何意外行为,请随时在 GitHub 上打开一个 issue。我们很乐意收到您的反馈!

接下来是什么

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