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的每locationwater_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的每个locationrandtagIndex的平均值。在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 locationrandtag。 这是因为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_interval5m则在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_creekwater_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_intervaloffset_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