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() 函数中的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如何帮助他们取得成功。提交您的评价,并获得一件限量版卫衣作为感谢。