首页 > 技术文章 > influxDB---Data Exploration

michellexiaoqi 2017-08-07 09:06 原文

the group clause

group by 返回的分组结果是根据用户指定的tag ,time interval。

1、group by tags

2、group by time intervals

group by time()分组查询返回用户指定时间间隔结果

语法:

SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]

Description of basic syntax

group by time()查询需要一个influxql功能在SELECT子句和WHERE子句中的一个时间范围。注意,group by子句必须位于WHERE子句之后。

time(time_interval)

group by time()的time_interval中time()是一个持续的文字。它决定了随着时间的推移influxdb分组的查询结果。例如,在WHERE子句中指定的时间范围内,一个time_interval设置5m,查询结果为5分钟的时间分组。

fill(<fill_option>)

fill(< fill_option >)是可选的。它更改没有数据的时间间隔报告的值。下面GROUP BY time intervals and fill() 更多信息。

coverage:

Group BY time()查询依赖于时间间隔和infuxDB的预设的时间边界,以确定每个时间间隔内包含的原始数据和查询返回的时间戳。

例子

下面的例子使用下面的示例数据样本:

> SELECT "water_level","location" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'

name: h2o_feet
--------------
time                   water_level   location
2015-08-18T00:00:00Z   8.12          coyote_creek
2015-08-18T00:00:00Z   2.064         santa_monica
2015-08-18T00:06:00Z   8.005         coyote_creek
2015-08-18T00:06:00Z   2.116         santa_monica
2015-08-18T00:12:00Z   7.887         coyote_creek
2015-08-18T00:12:00Z   2.028         santa_monica
2015-08-18T00:18:00Z   7.762         coyote_creek
2015-08-18T00:18:00Z   2.126         santa_monica
2015-08-18T00:24:00Z   7.635         coyote_creek
2015-08-18T00:24:00Z   2.041         santa_monica
2015-08-18T00:30:00Z   7.5           coyote_creek
2015-08-18T00:30:00Z   2.051         santa_monica

例子1

查询以12分钟间隔的结果

> 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)

name: h2o_feet
--------------
time                   count
2015-08-18T00:00:00Z   2
2015-08-18T00:12:00Z   2
2015-08-18T00:24:00Z   2

解释:

查询使用influxql函数计算water_level点数量与标签的location= coyote_creek设置组结果为12分钟。
每个时间戳的结果代表一个单独的12分钟间隔。对于第一个时间戳计算覆盖2015-08-18t00:00:00z到2015-08-18t00:12:00z原始数据,便不包括2015-08-18t00:12:00z。第二时间计数包括2015-08-18t00:12:00z与2015-08-18t00:24:00z原始数据,但不包括2015-08-18t00:24:00z。

例子2 :查询以12分钟的时间间隔和tag分组。

> SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"

name: h2o_feet
tags: location=coyote_creek
time                   count
----                   -----
2015-08-18T00:00:00Z   2
2015-08-18T00:12:00Z   2
2015-08-18T00:24:00Z   2

name: h2o_feet
tags: location=santa_monica
time                   count
----                   -----
2015-08-18T00:00:00Z   2
2015-08-18T00:12:00Z   2
2015-08-18T00:24:00Z   2

解释:

查询使用influxql函数计算water_level点数。设置标签tag locationt 和间隔为12分钟产生分组结果。注意,时间间隔和标记键在组子句中用逗号分隔。
查询返回两个结果序列:一个用于location标记的每个标记值。每个时间戳的结果代表一个单独的12分钟间隔。对于第一个时间戳计算覆盖2015-08-18t00:00:00z以上原始数据,但不包括2015-08-18t00:12:00z。第二时间计数包括2015-08-18t00:12:00z以上的原始数据,但不包括2015-08-18t00:24:00z。

基本语法的常见问题:

问题1:在查询结果中意外的时间戳和值

与基本语法,InfluxDB依赖group by time()间隔对系统预设的时间界限来确定原始数据包含在每个时间间隔和查询返回的时间戳。在某些情况下,这可能导致意想不到的结果。

例子

原始数据

> SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:18:00Z'
name: h2o_feet
--------------
time                   water_level
2015-08-18T00:00:00Z   8.12
2015-08-18T00:06:00Z   8.005
2015-08-18T00:12:00Z   7.887
2015-08-18T00:18:00Z   7.762

查询和结果:
下面的查询覆盖12分钟的时间范围,组结果分成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)

name: h2o_feet
time                   count
----                   -----
2015-08-18T00:00:00Z   1        <----- Note that this timestamp occurs before the start of the query's time range
2015-08-18T00:12:00Z   1

说明

InfluxDB使用预设时间间隔(GROUP BY intervals )时间界限是独立的在WHERE子句中不依赖于任何时间条件。当计算结果时,所有返回的数据必须出现在查询的显式时间范围内,但按组间隔将基于预先设置的时间边界。

下表显示了预设的时间边界,group by time()相关组分包括,和返回的时间戳为每个组的结果time()区间。

Time Interval NumberPreset Time Boundary(预定时间边界)GROUP BY time() IntervalPoints IncludedReturned Timestamp
1 time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:12:00Z time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:12:00Z 8.005 2015-08-18T00:00:00Z
2 time >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:24:00Z time >= 2015-08-12T00:12:00Z AND time < 2015-08-18T00:18:00Z 7.887 2015-08-18T00:12:00Z

第一预设12分钟的时间开始00:00和结束的边界就在00:12。只有一个原始点(8.005)在查询的第一个预设时间组中和第一个时间边界内都发生了下降。注意,返回的时间戳发生在查询时间范围开始之前,查询结果排除了查询时间范围内之前发生的数据。

第二预设12分钟的时间开始和结束的边界00:12之前00:24。在第二个预先时间边界只有一个原点(7.887)下跌查询的第二group by time()区间

 advanced GROUP BY time() syntax允许用户改变InfluxDB预设的时间界限的开始时间。

例子3

在高级语法部分中,继续使用这里所示的查询;它将预先设定的时间边界向前移动了6分钟,这样的影响就会有影响:

name: h2o_feet
time                   count
----                   -----
2015-08-18T00:06:00Z   2

3、Advanced Group by time() syntax

语法:

SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>,<offset_interval>),[tag_key] [fill(<fill_option>)]

高级group by time()查询需要influxQL功能在select语法中,where中一个时间区域语法。注意group by语法必须在where语法之后。

time(time_interval,offset_interval)

这是一offset_interval时间文字。它将向前或向后InfluxDB预设的时间界限。可以是正的或负的offset_interval。

coverage:

高级group by time()依赖于time_interval、偏移距和(offset_interval),influxDB的时间边界,以确定每个时间间隔内包含的原始数据和查询返回的时间戳。

例子

下面的示例使用下面的示例数据样本:

> SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:54:00Z'

name: h2o_feet
--------------
time                   water_level
2015-08-18T00:00:00Z   8.12
2015-08-18T00:06:00Z   8.005
2015-08-18T00:12:00Z   7.887
2015-08-18T00:18:00Z   7.762
2015-08-18T00:24:00Z   7.635
2015-08-18T00:30:00Z   7.5
2015-08-18T00:36:00Z   7.372
2015-08-18T00:42:00Z   7.234
2015-08-18T00:48:00Z   7.11
2015-08-18T00:54:00Z   6.982

例子1:组查询结果分成18分钟间隔,并将预置时间边界向前移动
> 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) name: h2o_feet time mean ---- ---- 2015-08-18T00:06:00Z 7.884666666666667 2015-08-18T00:24:00Z 7.502333333333333 2015-08-18T00:42:00Z 7.108666666666667

查询使用influxql函数计算平均water_level,分组结果为18分钟的时间间隔,并抵消了预先设定的时间界限,六分钟。
时间界限和返回的时间戳查询没有offset_interval的InfluxDB预设的时间界限。让我们先检查结果而不偏移:

> 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)

name: h2o_feet
time                   mean
----                   ----
2015-08-18T00:00:00Z   7.946
2015-08-18T00:18:00Z   7.6323333333333325
2015-08-18T00:36:00Z   7.238666666666667
2015-08-18T00:54:00Z   6.982

查询的时间边界和返回的时间戳,没有偏移量间隔,遵循影响到影响的时间边界:

Time Interval NumberPreset Time BoundaryGROUP BY time()IntervalPoints IncludedReturned Timestamp
1 time >= 2015-08-18T00:00:00Z AND time < 2015-08-18T00:18:00Z time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z 8.005,7.887 2015-08-18T00:00:00Z
2 time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z <— same 7.762,7.635,7.5 2015-08-18T00:18:00Z
3 time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z <— same 7.372,7.234,7.11 2015-08-18T00:36:00Z
4 time >= 2015-08-18T00:54:00Z AND time < 2015-08-18T01:12:00Z time = 2015-08-18T00:54:00Z 6.982 2015-08-18T00:54:00Z

第一预设18分钟的时间开始和结束的边界00:00之前00:18。两个原始点(8.005和7.887)下的第一组内的time()区间和在第一时间边界。注意,返回的时间戳发生在查询时间范围开始之前,查询结果排除了查询时间范围内发生的数据。

第二预设18分钟的时间开始和结束的边界就在00:36 00:18。三原点(7.762、7.635、7.5)第二组内的time()区间和第二时间边界。在这种情况下,边界时间范围和区间的时间范围是相同的。

第四预设18分钟的时间开始和结束的边界00:54之前1:12:00。一个原始点(6.982)下跌第四组内的time()区间在第四时间边界。

时间界限和返回的时间戳与offset_interval查询坚持偏移时间的界限:

Time Interval NumberOffset Time BoundaryGROUP BY time()IntervalPoints IncludedReturned Timestamp
1 time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z <— same 8.005,7.887,7.762 2015-08-18T00:06:00Z
2 time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z <— same 7.635,7.5,7.372 2015-08-18T00:24:00Z
3 time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z <— same 7.234,7.11,6.982 2015-08-18T00:42:00Z
4 time >= 2015-08-18T01:00:00Z AND time < 2015-08-18T01:18:00Z NA NA NA

 

 

 

 

4、The Group by clause and fill()

一般情况下,一个group by 间隔时间用null输出代表没有值的数据,可用fill()来改变没有值 的输出方式。fill()选项包括

  • 任何数字
  • null:设置null为间隔内没有数据的输出
  • previous:复制前一个间隔的值作为没有数据的输出
  • none:跳过没有值

以下的例子可以看出fill()的用法

GROUP BY without fill()

例子1 

SELECT MEAN(water_level) FROM h2o_feet WHERE time >= '2015-08-18' AND time < '2015-09-24' GROUP BY time(10d)
结果
name: h2o_feet
--------------
time			                 mean
2015-08-13T00:00:00Z	   4.306212083333323
2015-08-23T00:00:00Z	   4.318944629367029
2015-09-02T00:00:00Z	   4.363877681204781
2015-09-12T00:00:00Z   	 4.69811470811633
✨2015-09-22T00:00:00Z
GROUP BY with fill()
例子2
Use fill() with -100:
SELECT MEAN(water_level) FROM h2o_feet WHERE time >= '2015-08-18' AND time < '2015-09-24' GROUP BY time(10d) fill(-100)
结果
name: h2o_feet
--------------
time			                 mean
2015-08-13T00:00:00Z	   4.306212083333323
2015-08-23T00:00:00Z	   4.318944629367029
2015-09-02T00:00:00Z	   4.363877681204781
2015-09-12T00:00:00Z	   4.698114708116322
✨2015-09-22T00:00:00Z	   -100

例子3
Use fill() with none:
SELECT MEAN(water_level) FROM h2o_feet WHERE time >= '2015-08-18' AND time < '2015-09-24' GROUP BY time(10d) fill(none)
结果
name: h2o_feet
--------------
time			               mean
2015-08-13T00:00:00Z	 4.306212083333323
2015-08-23T00:00:00Z	 4.318944629367029
2015-09-02T00:00:00Z	 4.363877681204781
2015-09-12T00:00:00Z	 4.69811470811633
✨

注意:如果你用GROUP(ing) BY一些东西(如,有tags和一上时间间隔),fill()必须放在group by 的最后。
 

推荐阅读