TL;DR InfluxDB 技术提示 - 全面了解新的子查询!
作者:Regan Kuchan / 产品, 开发者
2017年1月26日
导航至
在这篇博文中,我们将介绍子查询;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
对另一个查询的结果执行额外的分析
子查询的另一个用途是对数学运算的结果执行函数。此用例等效于在函数内执行数学运算。以下查询计算每位 passenger
的 spilled_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
请注意,主查询中的 SELECT
和 WHERE
子句将 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 如何帮助他们取得成功的故事。提交您的客户评价,即可获得限量版连帽衫作为感谢。