InfluxDb中的数据查询语法Group子句
GROUP BY
子句后面可以跟用户指定的tags或者是一个时间间隔。
GROUP BY tags
GROUP BY <tag>
后面跟用户指定的tags,可以按照tag进行分组。
语法
SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]
- group by 后加一个或者多个tag key。
语法描述
GROUP BY *
对结果中的所有tag作group by。
GROUP BY <tag_key>
对结果按指定的tag作group by。
GROUP BY <tag_key>,<tag_key>
对结果数据按多个tag作group by,其中tag key的顺序没所谓。
例子
例一:对单个tag作group by
计算每个地方的平均降雨量:
> use NOAA_water_database > SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location" name: h2o_feet tags: location=coyote_creek time mean ---- ---- 1970-01-01T00:00:00Z 5.359342451341401 name: h2o_feet tags: location=santa_monica time mean ---- ---- 1970-01-01T00:00:00Z 3.530863470081006
-
上面的查询中用到了InfluxQL中的函数来计算measurement
h2o_feet
的每location
的water_level
的平均值。InfluxDB返回了两个series:分别是location
的两个值。 -
MEAN是一个函数,表示按照location进行分类求平均值,上面分了2个类,一个location=coyote_creek,一个location=santa_monica,可以看出coyote_creek这个地方的降雨量大一些。
说明:在InfluxDB中,epoch 0(
1970-01-01T00:00:00Z
)通常用作等效的空时间戳。如果要求查询不返回时间戳,例如无限时间范围的聚合函数,InfluxDB将返回epoch 0作为时间戳。
例二:对多个tag作group by
> SELECT MEAN("index") FROM "h2o_quality" GROUP BY location,randtag name: h2o_quality tags: location=coyote_creek, randtag=1 time mean ---- ---- 1970-01-01T00:00:00Z 50.69033760186263 name: h2o_quality tags: location=coyote_creek, randtag=2 time mean ---- ---- 1970-01-01T00:00:00Z 49.661867544220485 name: h2o_quality tags: location=coyote_creek, randtag=3 time mean ---- ---- 1970-01-01T00:00:00Z 49.360939907550076 name: h2o_quality tags: location=santa_monica, randtag=1 time mean ---- ---- 1970-01-01T00:00:00Z 49.132712456344585 name: h2o_quality tags: location=santa_monica, randtag=2 time mean ---- ---- 1970-01-01T00:00:00Z 50.2937984496124 name: h2o_quality tags: location=santa_monica, randtag=3 time mean ---- ---- 1970-01-01T00:00:00Z 49.99919903884662
上面的查询中用到了InfluxQL中的函数来计算measurement h2o_quality
的每个location
和randtag
的Index
的平均值。在GROUP BY
子句中用逗号来分割多个tag。
例三:对所有tag作group by
> SELECT MEAN("index") FROM "h2o_quality" GROUP BY * name: h2o_quality tags: location=coyote_creek, randtag=1 time mean ---- ---- 1970-01-01T00:00:00Z 50.55405446521169 name: h2o_quality tags: location=coyote_creek, randtag=2 time mean ---- ---- 1970-01-01T00:00:00Z 50.49958856271162 name: h2o_quality tags: location=coyote_creek, randtag=3 time mean ---- ---- 1970-01-01T00:00:00Z 49.5164137518956 name: h2o_quality tags: location=santa_monica, randtag=1 time mean ---- ---- 1970-01-01T00:00:00Z 50.43829082296367 name: h2o_quality tags: location=santa_monica, randtag=2 time mean ---- ---- 1970-01-01T00:00:00Z 52.0688508894012 name: h2o_quality tags: location=santa_monica, randtag=3 time mean ---- ---- 1970-01-01T00:00:00Z 49.29386362086556
上面的查询中用到了InfluxQL中的函数来计算measurement h2o_quality
的每个tag的Index
的平均值。
请注意,查询结果与例二中的查询结果相同,其中我们明确指定了tag key location
和randtag
。 这是因为measurement h2o_quality
中只有这两个tag key。
GROUP BY时间间隔
GROUP BY time()
返回结果按指定的时间间隔group by。
基本的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
子句中的InfluxQL函数和WHERE
子句中的时间范围。请注意,GROUP BY
子句必须在WHERE
子句之后。
time(time_interval)
GROUP BY time()
语句中的time_interval
是一个时间duration。决定了InfluxDB按什么时间间隔group by。例如:time_interval
为5m
则在WHERE
子句中指定的时间范围内将查询结果分到五分钟时间组里。
fill(<fill_option>)
fill(<fill_option>)
是可选的。它会更改不含数据的时间间隔的返回值。
覆盖范围:基本GROUP BY time()
查询依赖于time_interval
和InfluxDB的预设时间边界来确定每个时间间隔中包含的原始数据以及查询返回的时间戳。
基本语法示例
下面的例子用到的示例数据如下:
> 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
例一:时间间隔为12分钟的group by
> 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函数来计算location=coyote_creek
的water_level
数,并将其分组结果分为12分钟间隔。每个时间戳的结果代表一个12分钟的间隔。 第一个时间戳记的计数涵盖大于2015-08-18T00:00:00Z
的原始数据,但小于且不包括2015-08-18T00:12:00Z
。第二时间戳的计数涵盖大于2015-08-18T00:12:00Z
的原始数据,但小于且不包括2015-08-18T00:24:00Z
。
例二:时间间隔为12分钟并且还对tag key作group by
> 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_leval
的数量。它将结果按location
分组并分隔12分钟。请注意,时间间隔和tag key在GROUP BY
子句中以逗号分隔。查询返回两个measurement的结果:针对tag location
的每个值。每个时间戳的结果代表一个12分钟的间隔。第一个时间戳记的计数涵盖大于2015-08-18T00:00:00Z
的原始数据,但小于且不包括2015-08-18T00:12:00Z
。第二时间戳的计数涵盖大于2015-08-18T00:12:00Z
原始数据,但小于且不包括2015-08-18T00:24:00Z
。
基本语法的共同问题
在查询结果中出现意想不到的时间戳和值
使用基本语法,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 <----- 请注意,此时间戳记的发生在查询时间范围最小值之前 2015-08-18T00:12:00Z 1
解释:
InfluxDB使用独立于WHERE
子句中任何时间条件的GROUP BY
间隔的预设的四舍五入时间边界。当计算结果时,所有返回的数据必须在查询的显式时间范围内发生,但GROUP BY
间隔将基于预设的时间边界。
下表显示了结果中预设时间边界,相关GROUP BY time()
间隔,包含的点以及每个GROUP BY time()
间隔的返回时间戳。
时间间隔序号 | 预设的时间边界 | GROUP BY time() 间隔 |
包含的数据点 | 返回的时间戳 |
---|---|---|---|---|
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
)落在查询的第一个GROUP BY time()
间隔内,并且在第一个时间边界。请注意,虽然返回的时间戳在查询的时间范围开始之前发生,但查询结果排除了查询时间范围之前发生的数据。
第二个预设的12分钟时间边界从00:12
开始,在00:24
之前结束。 只有一个原点(7.887
)都在查询的第二个GROUP BY time()
间隔内,在该第二个时间边界内。
高级GROUP BY time()
语法允许用户移动InfluxDB预设时间边界的开始时间。高级语法部分中的例三将继续显示此处的查询; 它将预设时间边界向前移动六分钟,以便InfluxDB返回:
name: h2o_feet time count ---- ----- 2015-08-18T00:06:00Z 2
高级GROUP BY time()
语法
语法
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
子句中的InfluxQL函数和WHERE
子句中的时间范围。 请注意,GROUP BY
子句必须在WHERE
子句之后。
time(time_interval,offset_interval)
offset_interval
是一个持续时间。它向前或向后移动InfluxDB的预设时间界限。offset_interval
可以为正或负。
fill(<fill_option>)
fill(<fill_option>)
是可选的。它会更改不含数据的时间间隔的返回值。
范围
高级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
例一:查询结果间隔按18分钟group by,并将预设时间边界向前移动
> 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的预设时间边界。我们先来看看没有offset_interval
的结果:
> 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
没有offset_interval
的查询的时间边界和返回的时间戳符合InfluxDB的预设时间界限:
时间间隔序号 | 预设的时间边界 | GROUP BY time() 间隔 |
包含的数据点 | 返回的时间戳 |
---|---|---|---|---|
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 |
同坐 |
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 |
同左 |
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
)都落在第一个GROUP BY time()
间隔内,并且在第一个时间边界。请注意,虽然返回的时间戳在查询的时间范围开始之前发生,但查询结果排除了查询时间范围之前发生的数据。
第二个预设的18分钟时间边界从00:18
开始,在00:36
之前结束。 三个点(7.762和7.635和7.5
)都落在第二个GROUP BY time()
间隔内,在第二个时间边界。 在这种情况下,边界时间范围和间隔时间范围是相同的。
第四个预设的18分钟时间边界从00:54
开始,在1:12:00
之前结束。 一个点(6.982
)落在第四个GROUP BY time()
间隔内,在第四个时间边界。
具有offset_interval
的查询的时间边界和返回的时间戳符合偏移时间边界:
时间间隔序号 | 预设的时间边界 | GROUP BY time() 间隔 |
包含的数据点 | 返回的时间戳 |
---|---|---|---|---|
1 | time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z |
同左 |
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 |
同坐 |
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 |
同左 |
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 |
无 |
无 |
无 |
六分钟偏移间隔向前移动预设边界的时间范围,使得边界时间范围和相关GROUP BY time()
间隔时间范围始终相同。使用偏移量,每个间隔对三个点执行计算,返回的时间戳与边界时间范围的开始和GROUP BY time()
间隔时间范围的开始匹配。
请注意,offset_interval
强制第四个时间边界超出查询的时间范围,因此查询不会返回该最后一个间隔的结果。
例二:查询结果按12分钟间隔group by,并将预设时间界限向后移动
> 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) 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分钟的时间间隔,并将预设时间边界偏移-12分钟。
注意:例二中的查询返回与例一中的查询相同的结果,但例二中的查询使用负的
offset_interval
而不是正的offset_interval
。 两个查询之间没有性能差异; 在确定正负offset_intervel
之间时,请任意选择最直观的选项。
没有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
没有offset_interval
的查询的时间边界和返回的时间戳符合InfluxDB的预设时间界限:
时间间隔序号 | 预设的时间边界 | GROUP BY time() 间隔 |
包含的数据点 | 返回的时间戳 |
---|---|---|---|---|
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 |
同坐 |
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 |
同左 |
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
)都落在第一个GROUP BY time()
间隔内,并且在第一个时间边界。请注意,虽然返回的时间戳在查询的时间范围开始之前发生,但查询结果排除了查询时间范围之前发生的数据。
第二个预设的18分钟时间边界从00:18
开始,在00:36
之前结束。 三个点(7.762和7.635和7.5
)都落在第二个GROUP BY time()
间隔内,在第二个时间边界。 在这种情况下,边界时间范围和间隔时间范围是相同的。
第四个预设的18分钟时间边界从00:54
开始,在1:12:00
之前结束。 一个点(6.982
)落在第四个GROUP BY time()
间隔内,在第四个时间边界。
具有offset_interval
的查询的时间边界和返回的时间戳符合偏移时间边界:
时间间隔序号 | 预设的时间边界 | GROUP BY time() 间隔 |
包含的数据点 | 返回的时间戳 |
---|---|---|---|---|
1 | time >= 2015-08-17T23:48:00Z AND time < 2015-08-18T00:06:00Z |
无 |
无 |
无 |
2 | time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z |
同左 |
8.005,7.887,7.762 |
2015-08-18T00:06:00Z |
3 | time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z |
同坐 |
7.635,7.5,7.372 |
2015-08-18T00:24:00Z |
4 | time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z |
同左 |
7.234,7.11,6.982 |
2015-08-18T00:42:00Z |
负十二分钟偏移间隔向后移动预设边界的时间范围,使得边界时间范围和相关GROUP BY time()
间隔时间范围始终相同。使用偏移量,每个间隔对三个点执行计算,返回的时间戳与边界时间范围的开始和GROUP BY time()
间隔时间范围的开始匹配。
请注意,offset_interval
强制第一个时间边界超出查询的时间范围,因此查询不会返回该最后一个间隔的结果。
例三:查询结果按12分钟间隔group by,并将预设时间边界向前移动
这个例子是上面*基本语法的问题*的继续
> 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,6m) name: h2o_feet time count ---- ----- 2015-08-18T00:06:00Z 2
该查询使用InfluxQL函数来计算平均water_level
,将结果分组为12分钟的时间间隔,并将预设时间边界偏移六分钟。
没有offset_interval
的查询的时间边界和返回的时间戳符合InfluxDB的预设时间边界。我们先来看看没有offset_interval
的结果:
> 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 2015-08-18T00:12:00Z 1
没有offset_interval
的查询的时间边界和返回的时间戳符合InfluxDB的预设时间界限:
时间间隔序号 | 预设的时间边界 | GROUP BY time() 间隔 |
包含的数据点 | 返回的时间戳 |
---|---|---|---|---|
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
)落在查询的第一个GROUP BY time()
间隔内,并且在第一个时间边界。请注意,虽然返回的时间戳在查询的时间范围开始之前发生,但查询结果排除了查询时间范围之前发生的数据。
第二个预设的12分钟时间边界从00:12
开始,在00:24
之前结束。 只有一个原点(7.887
)都在查询的第二个GROUP BY time()
间隔内,在该第二个时间边界内。
具有offset_interval
的查询的时间边界和返回的时间戳符合偏移时间边界:
时间间隔序号 | 预设的时间边界 | GROUP BY time() 间隔 |
包含的数据点 | 返回的时间戳 |
---|---|---|---|---|
1 | time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z |
同左 |
8.005,7.887 |
2015-08-18T00:06:00Z |
2 | time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:30:00Z |
无 |
无 |
无 |
六分钟偏移间隔向前移动预设边界的时间范围,使得边界时间范围和相关GROUP BY time()
间隔时间范围始终相同。使用偏移量,每个间隔对三个点执行计算,返回的时间戳与边界时间范围的开始和GROUP BY time()
间隔时间范围的开始匹配。
请注意,offset_interval
强制第二个时间边界超出查询的时间范围,因此查询不会返回该最后一个间隔的结果。
GROUP BY time()加fill()
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()
更改不含数据的时间间隔返回的值。请注意,如果GROUP(ing)BY
多个对象(例如,tag和时间间隔),那么fill()
必须位于GROUP BY
子句的末尾。
fill的参数
- 任一数值:用这个数字返回没有数据点的时间间隔
- linear:返回没有数据的时间间隔的线性插值结果。
- none: 不返回在时间间隔里没有点的数据
- previous:返回时间隔间的前一个间隔的数据
例子:
例一:fill(100)
不带fill(100)
:
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) name: h2o_feet -------------- time max 2015-09-18T16:00:00Z 3.599 2015-09-18T16:12:00Z 3.402 2015-09-18T16:24:00Z 3.235 2015-09-18T16:36:00Z
带fill(100)
:
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(100) name: h2o_feet -------------- time max 2015-09-18T16:00:00Z 3.599 2015-09-18T16:12:00Z 3.402 2015-09-18T16:24:00Z 3.235 2015-09-18T16:36:00Z 100
例二:fill(linear)
不带fill(linear)
:
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:00:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) name: pond time mean ---- ---- 2016-11-11T21:00:00Z 1 2016-11-11T21:12:00Z 2016-11-11T21:24:00Z 3 2016-11-11T21:36:00Z 2016-11-11T21:48:00Z 2016-11-11T22:00:00Z 6
带fill(linear)
:
> SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:00:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear) name: pond time mean ---- ---- 2016-11-11T21:00:00Z 1 2016-11-11T21:12:00Z 2 2016-11-11T21:24:00Z 3 2016-11-11T21:36:00Z 4 2016-11-11T21:48:00Z 5 2016-11-11T22:00:00Z 6
例三:fill(none)
不带fill(none)
:
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) name: h2o_feet -------------- time max 2015-09-18T16:00:00Z 3.599 2015-09-18T16:12:00Z 3.402 2015-09-18T16:24:00Z 3.235 2015-09-18T16:36:00Z
带fill(none)
:
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(none) name: h2o_feet -------------- time max 2015-09-18T16:00:00Z 3.599 2015-09-18T16:12:00Z 3.402 2015-09-18T16:24:00Z 3.235
例四:fill(null)
不带fill(null)
:
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) name: h2o_feet -------------- time max 2015-09-18T16:00:00Z 3.599 2015-09-18T16:12:00Z 3.402 2015-09-18T16:24:00Z 3.235 2015-09-18T16:36:00Z
带fill(null)
:
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) fill(null) name: h2o_feet -------------- time max 2015-09-18T16:00:00Z 3.599 2015-09-18T16:12:00Z 3.402 2015-09-18T16:24:00Z 3.235 2015-09-18T16:36:00Z
例五:fill(previous)
不带fill(previous)
:
> SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z' GROUP BY time(12m) name: h2o_feet -------------- time max 2015-09-18T16:00:00Z 3.599 2015-09-18T16:12:00Z 3.402 2015-09-18T16:24:00Z 3.235 2015-09-18T16:36:00Z