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()
函数中的field key
。为了理解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上提交问题。我们非常欢迎您的反馈!
接下来是什么
- 下载页面上有TICK栈的下载链接。
- 云上部署:使用完全托管集群、Kapacitor和Grafana的InfluxDB Cloud进行免费试用。
- 服务器上部署:想要在您的服务器上运行InfluxDB集群?尝试免费14天的InfluxDB Enterprise试用,它具有直观的界面,用于部署、监控和重新平衡集群,以及管理备份和恢复。
- 分享您的故事:300多家公司分享了他们的故事,讲述了InfluxDB如何帮助他们取得成功。提交您的评价,并获得一件限量版卫衣作为感谢。