本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/)
GROUP BY子句通过用户自己制定的tags set或time区间,来将查询结果进行分组。
GROUP BY <tag> 通过用户指定的tag set,来对查询结果进行分组。 语法:
SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]
| GROUP BY子句 | 意义 |
|---|---|
注 :如果在sql中同时存在WHERE子句和GROUP BY子句,则GROUP BY子句一定要在WHERE子句之后!
Other supported features: Regular Expressions
GROUP BY tags 示例sql
- Group query results by a single tag
上面的sql使用了MEAN函数,来对h2o_feet这个measurement中的location这个tag进行分组求平均值。 注:在InfluxDB中,<font color=Red size=2>0纪元1970-01-01T00:00:00Z</font>这个时间经常被用来表示timestamp的NULL值。如果你的查询中没有显示指定返回一个timestamp,比如上面在调用聚合函数时,就没有指定时间区间,因此InfluxDB最后返回0纪元来作为timestamp。
- Group query results by more than one tag
- Group query results by all tags
GROUP BY time() 查询会将查询结果按照用户指定的时间区间来进行分组。 语法:
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]
基本的 GROUP BY time() 查询用法需要在SELECT子句中调用相关函数,并且在WHERE子句中调用time时间区间。
time(time_interval) 在GROUP BY time()子句中的time_interval是个连续的时间区间,该时间区间决定了InfluxDB如何通过时间来对查询结果进行分组。比如,如果time_interval为5m,那么它会将查询结果分为5分钟一组(如果在WHERE子句中指定了time区间,那么就是将WHERE中指定的time区间划分为没5分钟一组)。
fill(<fill_option>) fill(<fill_option>) 是可选的。它可以填充那些没有数据的时间区间的值。 从GROUP BY time intervals and fill() 部分可查看到关于这部分的更多信息。
注:基本的GROUP BY time()查询通过当前InfluxDB数据库的预设时间边界来确定每个时间间隔中包含的原始数据和查询返回的时间戳。
先看一个WHERE查询

下面的GROUP BY time(time_interval)示例是在上面的sql基础上进行改进的,sql为:
SELECT COUNT("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:00:00Z'
AND time <= '2015-08-18T00:30:00Z'
GROUP BY time(12m)
查询结果:

注意:在查询结果中,时间区间是左闭右开的。拿第一行查询结果数据来说,2015-08-18T00:00:00Z表示的时间区间是[2015-08-18T00:00:00, 2015-08-18T00:12:00Z )
问题:查询结果中有预期之外的时间区间和值。 在基本用法中,GROUP BY time()查询通过当前InfluxDB数据库的预设时间边界来确定每个时间间隔中包含的原始数据和查询返回的时间戳,这有可能会导致预期之外的结果值。 比如,通过如下sql:
SELECT "water_level" FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:00:00Z'
AND time <= '2015-08-18T00:18:00Z'
我们查询到原始数据如下所示:

在接下来的查询中,我们通过WHERE子句,指定查询12分钟内的数据,并通过GROUP BY子句,将查询结果按12分钟的时间区间进行分组。
SELECT COUNT("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time < '2015-08-18T00:18:00Z'
GROUP BY time(12m)
按照预想,因为查询的是12分钟内的数据,并且group by时是按照12分钟来进行分组的,所以最后的查询结果应该只有一行而已。然后实际的查询结果却有两行:

高级的GROUP BY time()语法允许用户自定义预设时间边界的开始时间。在高级语法小节的示例sql3中,将展示这种用法,它查询的结果如下:

语法如下:
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>,<offset_interval>),[tag_key] [fill(<fill_option>)]
在GROUP BY time()高级语法中,需要在SELECT子句中调用InfluxDB的函数,并在WHERE子句中指定时间区间。并且需要注意到的是,GROUP BY子句必须在WHERE子句之后!
time(time_interval,offset_interval) 在GROUP BY time()子句中的通过time_interval和offset_interval来表示一个连续的时间区间,该时间区间决定了InfluxDB如何通过时间来对查询结果进行分组。比如,如果时间区间为5m,那么它会将查询结果分为5分钟一组(如果在WHERE子句中指定了time区间,那么就是将WHERE中指定的time区间划分为没5分钟一组)。 offset_interval是持续时间文本。它向前或向后移动InfluxDB数据库的预设时间边界。offset_interval可以为正或负。
fill(<fill_option>) fill(<fill_option>)是可选的。 它可以填充那些没有数据的时间区间的值。 从 GROUP BY time intervals and fill() 部分可查看到关于这部分的更多信息。
注:高级 GROUP BY time() 语法依赖于time_interval、offset_interval、以及 InfluxDB 数据库的预设时间边界来确定每组内的数据条数、以及查询结果的时间戳。
高级用法示例sql
先看如下查询sql
SELECT "water_level" FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:00:00Z'
AND time <= '2015-08-18T00:54:00Z'
查询结果:

SELECT MEAN("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time <= '2015-08-18T00:54:00Z'
GROUP BY time(18m,6m)
查询结果:

SELECT MEAN("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time <= '2015-08-18T00:54:00Z'
GROUP BY time(18m)

SELECT MEAN("water_level") FROM "h2o_feet"
WHERE "location"='coyote_creek'
AND time >= '2015-08-18T00:06:00Z'
AND time <= '2015-08-18T00:54:00Z'
GROUP BY time(18m,-12m);
查询结果

Fill() 可以填充那些没有数据的时间区间的值。 语法:
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(time_interval,[<offset_interval])[,tag_key] [fill(<fill_option>)]
默认情况下,在GROUP BY time()查询结果中,若某个时间区间没有数据,则该时间区间对应的值为null。通过fill(),就可以填充那些没有数据的时间区间的值。 需要注意的是,fill()必须出现在GROUP BY子句的最后。
Fill选项
示例:
1) fill(100)
2) fill(linear)
3) fill(none)
4) fill(null)
5) fill(previous)
至此,group by部分教程结束。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3147738/ ,如需转载,请注明出处,否则将追究法律责任。