子查询
子查询是在另一个查询的 FROM
子句中嵌套的查询。使用子查询将查询应用为封闭查询中的条件。子查询提供类似于嵌套函数和 SQL HAVING
子句 的功能。
注意: InfluxQL 不支持 HAVING
子句。
语法
SELECT_clause FROM ( SELECT_statement ) [...]
InfluxDB 首先执行子查询,然后执行主查询。
主查询包围子查询,并且至少需要 SELECT
子句 和 FROM
子句。主查询支持 InfluxQL 2.x 文档中列出的所有子句。
子查询出现在主查询的 FROM
子句中,并且需要用括号括起来。子查询也支持 InfluxQL 2.x 文档中列出的所有子句。
InfluxQL 支持每个主查询的多个嵌套子查询。多个子查询的示例语法
SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
注意: #### 提高时间绑定子查询的性能 为了提高具有时间绑定子查询的 InfluxQL 查询的性能,请将 WHERE time
子句应用于外部查询,而不是内部查询。例如,以下查询返回相同的结果,但外部查询上具有时间限制的查询比内部查询上具有时间限制的查询性能更高
外部查询上的时间限制(推荐)
SELECT inner_value AS value FROM (SELECT raw_value as inner_value)
WHERE time >= '2022-07-19T21:00:00Z'
AND time <= '2022-07-20T22:00:00Z'
内部查询上的时间限制
SELECT inner_value AS value FROM (
SELECT raw_value as inner_value
WHERE time >= '2022-07-19T21:00:00Z'
AND time <= '2022-07-20T22:00:00Z'
)
示例
计算几个 MAX() 值的 SUM()
SELECT SUM("max") FROM (SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location")
输出
时间 | 总和 |
---|
1970-01-01T00:00:00Z | 17.169 |
查询返回每个 location
标签值的最大 water_level
值的总和。
InfluxDB 首先执行子查询;它计算每个 location
标签值的 water_level
最大值
SELECT MAX("water_level") FROM "h2o_feet" GROUP BY "location"
输出
时间 | 最大值 |
---|
2015-08-29T07:24:00Z | 9.9640000000 |
接下来,InfluxDB 执行主查询并计算这些最大值的总和:9.9640000000
+ 7.2050000000
= 17.169
。请注意,主查询指定 max
,而不是 water_level
,作为 SUM()
函数中的字段键。
计算两个字段之间差值的 MEAN()
SELECT MEAN("difference") FROM (SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare")
输出
时间 | 最大值 |
---|
1970-01-01T00:00:00Z | 1.75 |
查询返回 pet_daycare
测量中 cats
和 dogs
数量之间差值的平均值。
InfluxDB 首先执行子查询。子查询计算 cats
字段中的值与 dogs
字段中的值之间的差值,并将输出列命名为 difference
SELECT "cats" - "dogs" AS "difference" FROM "pet_daycare"
输出
时间 | 差值 |
---|
2017-01-20T00:55:56Z | -1 |
2017-01-21T00:55:56Z | -49 |
2017-01-22T00:55:56Z | 66 |
2017-01-23T00:55:56Z | -9 |
接下来,InfluxDB 执行主查询并计算这些差值的平均值。请注意,主查询指定 difference
作为 MEAN()
函数中的字段键。
计算几个 MEAN() 值并对这些平均值设置条件
SELECT "all_the_means" FROM (SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2019-08-18T00:00:00Z' AND time <= '2019-08-18T00:30:00Z' GROUP BY time(12m) ) WHERE "all_the_means" > 5
输出
时间 | all_the_means |
---|
2019-08-18T00:00:00Z | 5.4135000000 |
2019-08-18T00:12:00Z | 5.3042500000 |
2019-08-18T00:24:00Z | 5.1682500000 |
查询返回所有大于五的 water_level
字段的平均值。
InfluxDB 首先执行子查询。子查询计算从 2019-08-18T00:00:00Z
到 2019-08-18T00:30:00Z
的 water_level
的 MEAN()
值,并将结果分组为 12 分钟间隔。它还将输出列命名为 all_the_means
SELECT MEAN("water_level") AS "all_the_means" FROM "h2o_feet" WHERE time >= '2019-08-18T00:00:00Z' AND time <= '2019-08-18T00:30:00Z' GROUP BY time(12m)
输出
时间 | all_the_means |
---|
2019-08-18T00:00:00Z | 5.4135000000 |
2019-08-18T00:12:00Z | 5.3042500000 |
2019-08-18T00:24:00Z | 5.1682500000 |
接下来,InfluxDB 执行主查询,并且仅返回那些大于五的平均值。请注意,主查询指定 all_the_means
作为 SELECT
子句中的字段键。
计算几个 DERIVATIVE() 值的 SUM()
SELECT SUM("water_level_derivative") AS "sum_derivative" FROM (SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2019-08-18T00:00:00Z' AND time <= '2019-08-18T00:30:00Z' GROUP BY time(12m),"location") GROUP BY "location"
输出
时间 | sum_derivative |
---|
1970-01-01T00:00:00Z | -0.5315000000 |
时间 | sum_derivative |
---|
1970-01-01T00:00:00Z | -0.2375000000 |
查询返回每个 location
标签值的平均 water_level
值的导数的总和。
InfluxDB 首先执行子查询。子查询计算以 12 分钟间隔采样的平均 water_level
值的导数。它对每个 location
标签值执行该计算,并将输出列命名为 water_level_derivative
SELECT DERIVATIVE(MEAN("water_level")) AS "water_level_derivative" FROM "h2o_feet" WHERE time >= '2019-08-18T00:00:00Z' AND time <= '2019-08-18T00:30:00Z' GROUP BY time(12m),"location"
输出
时间 | water_level_derivative |
---|
2019-08-18T00:00:00Z | -0.1410000000 |
2019-08-18T00:12:00Z | -0.1890000000 |
2019-08-18T00:24:00Z | -0.2015000000 |
时间 | water_level_derivative |
---|
2019-08-18T00:00:00Z | -0.1375000000 |
2019-08-18T00:12:00Z | -0.0295000000 |
2019-08-18T00:24:00Z | -0.0705000000 |
接下来,InfluxDB 执行主查询并计算每个 location
标签值的 water_level_derivative
值的总和。请注意,主查询指定 water_level_derivative
,而不是 water_level
或 derivative
,作为 SUM()
函数中的字段键。
子查询的常见问题
子查询中的多个语句
InfluxQL 支持每个主查询的多个嵌套子查询
SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
------------------ ----------------
Subquery 1 Subquery 2
InfluxQL 不支持每个子查询的多个 SELECT
语句
SELECT_clause FROM (SELECT_statement; SELECT_statement) [...]
如果子查询包含多个 SELECT
语句,系统将返回解析错误。
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您提供关于 InfluxDB 和此文档的反馈和错误报告。要获得支持,请使用以下资源
拥有年度合同或支持合同的客户可以联系 InfluxData 支持。