全部产品
Search
文档中心

时间序列数据库 TSDB:GROUP BY子句

更新时间:Jun 08, 2023

GROUP BY子句按用户指定的tag或者时间区间对查询结果进行分组。

GROUP BY tags

GROUP BY <tag>按用户指定的tag对查询结果进行分组。

语法

SELECT_clause FROM_clause [WHERE_clause] GROUP BY [*|<tag_key>[,<tag_key]]

语法描述

GROUP BY *按所有tag对查询结果进行分组。

GROUP BY <tag_key>按指定的一个tag对查询结果进行分组。

GROUP BY <tag_key>,<tag_key>按多个tag对查询结果进行分组,tag key的顺序对结果无影响。

如果查询语句中包含一个WHERE子句,那么GROUP BY子句必须放在该WHERE子句后面。

除此之外,GROUP BY子句还支持的功能:正则表达式。

示例

按单个tag对查询结果进行分组

 SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"

name: h2o_feet
tags: location=coyote_creek
time                     mean
--------
1970-01-01T00:00:00Z5.359342451341401


name: h2o_feet
tags: location=santa_monica
time                     mean
--------
1970-01-01T00:00:00Z3.530863470081006

该查询使用了InfluxQL中的一个函数计算measurement h2o_feet中每个locationwater_level的平均值。TSDB For InfluxDB®返回两个序列的结果:每个location的值对应一个序列。

说明

在TSDB For InfluxDB®中,epoch 0(1970-01-01T00:00:00Z)通常用作空时间戳。如果在您的请求结果中没有时间戳返回,例如您用了具有无限时间范围的聚合函数,TSDB For InfluxDB®将返回epoch 0作为时间戳。

按多个tag对查询结果进行分组

 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:00Z50.69033760186263

name: h2o_quality
tags: location=coyote_creek, randtag=2
time                   mean
--------
1970-01-01T00:00:00Z49.661867544220485

name: h2o_quality
tags: location=coyote_creek, randtag=3
time                   mean
--------
1970-01-01T00:00:00Z49.360939907550076

name: h2o_quality
tags: location=santa_monica, randtag=1
time                   mean
--------
1970-01-01T00:00:00Z49.132712456344585

name: h2o_quality
tags: location=santa_monica, randtag=2
time                   mean
--------
1970-01-01T00:00:00Z50.2937984496124

name: h2o_quality
tags: location=santa_monica, randtag=3
time                   mean
--------
1970-01-01T00:00:00Z49.99919903884662

该查询使用了InfluxQL中的一个函数计算measurement h2o_quality中每个locationrandtag的组合的index的平均值,其中,location有2个不同的值,randtag有3个不同的值,总共有6个不同的组合。在GROUP BY子句中,用逗号将多个tag隔开。

按所有tag对查询结果进行分组

 SELECT MEAN("index") FROM "h2o_quality" GROUP BY *

name: h2o_quality
tags: location=coyote_creek, randtag=1
time                  mean
--------
1970-01-01T00:00:00Z50.69033760186263

name: h2o_quality
tags: location=coyote_creek, randtag=2
time                   mean
--------
1970-01-01T00:00:00Z49.661867544220485

name: h2o_quality
tags: location=coyote_creek, randtag=3
time                   mean
--------
1970-01-01T00:00:00Z49.360939907550076

name: h2o_quality
tags: location=santa_monica, randtag=1
time                   mean
--------
1970-01-01T00:00:00Z49.132712456344585

name: h2o_quality
tags: location=santa_monica, randtag=2
time                   mean
--------
1970-01-01T00:00:00Z50.2937984496124

name: h2o_quality
tags: location=santa_monica, randtag=3
time                   mean
--------
1970-01-01T00:00:00Z49.99919903884662

该查询使用了InfluxQL中的一个函数计算measurement h2o_quality中每个tag的组合的index的平均值。

说明

该查询的结果与上面例子中的查询结果相同,这是因为在h2o_quality中,只有两个tag key:locationrandtag

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

基本语法描述

基本的GROUP BY time()查询需要在SELECT子句中包含一个InfluxQL函数,并且在WHERE子句中包含时间范围。请注意,GROUP BY子句必须放在WHERE子句后面。

  • time(time_interval):子句中的time_interval(时间间隔)是一个持续时间(duration),决定了TSDB For InfluxDB®按多大的时间间隔将查询结果进行分组。例如,当time_interval5m时,那么在WHERE子句中指定的时间范围内,将查询结果按5分钟进行分组。

  • fill(<fill_option>):可选,它会改变不含数据的时间间隔的返回值。

覆盖范围

基本的GROUP BY time()查询依赖time_interval和TSDB For 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:00Z8.12          coyote_creek
2015-08-18T00:00:00Z2.064         santa_monica
2015-08-18T00:06:00Z8.005         coyote_creek
2015-08-18T00:06:00Z2.116         santa_monica
2015-08-18T00:12:00Z7.887         coyote_creek
2015-08-18T00:12:00Z2.028         santa_monica
2015-08-18T00:18:00Z7.762         coyote_creek
2015-08-18T00:18:00Z2.126         santa_monica
2015-08-18T00:24:00Z7.635         coyote_creek
2015-08-18T00:24:00Z2.041         santa_monica
2015-08-18T00:30:00Z7.5           coyote_creek
2015-08-18T00:30:00Z2.051         santa_monica

将查询结果按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:00Z2
2015-08-18T00:12:00Z2
2015-08-18T00:24:00Z2

该查询使用了InfluxQL中的一个函数计算measurement h2o_feetlocation = coyote_creekwater_level的数据点数,并将结果按12分钟为间隔进行分组。

每个时间戳所对应的结果代表一个12分钟间隔所对应的结果。第一个时间戳的计数(count)涵盖了从2015-08-18T00:00:00Z2015-08-18T00:12:00Z的原始数据(不包括2015-08-18T00:12:00Z)。第二个时间戳的计数涵盖了从2015-08-18T00:12:00Z2015-08-18T00:24:00的原始数据(不包括2015-08-18T00:24:00)。

将查询结果按12分钟的时间间隔和一个tag key进行分组

 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:00Z2
2015-08-18T00:12:00Z2
2015-08-18T00:24:00Z2

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

该查询使用了InfluxQL中的一个函数计算water_level的数据点数,并将结果按tag location和12分钟间隔进行分组。请注意,在GROUP BY子句中,用逗号将时间间隔和tag key隔开。

该查询返回两个序列:每个location的值对应一个序列。每个时间戳所对应的结果代表一个12分钟间隔所对应的结果。第一个时间戳的计数(count)涵盖了从2015-08-18T00:00:00Z2015-08-18T00:12:00Z的原始数据(不包括2015-08-18T00:12:00Z)。第二个时间戳的计数涵盖了从2015-08-18T00:12:00Z2015-08-18T00:24:00的原始数据(不包括2015-08-18T00:24:00)。

基本语法的常见问题

查询结果中出现时间戳和值

使用基本语法,TSDB For 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:00Z8.12
2015-08-18T00:06:00Z8.005
2015-08-18T00:12:00Z7.887
2015-08-18T00:18:00Z7.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:00Z1<-----Note that this timestamp occurs before the start of the query's time range
2015-08-18T00:12:00Z   1
说明

TSDB For InfluxDB®对GROUP BY的时间间隔使用预设的四舍五入时间边界,不依赖于WHERE子句中任何时间条件。在计算结果的时候,所有返回数据的时间戳必须在查询中明确规定的时间范围内,但是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-18T00:12:00Z AND time < 2015-08-18T00:24:00Z

time >= 2015-08-18T00:12:00Z AND time < 2015-08-18T00:18:00Z

7.887

2015-08-18T00:12:00Z

第一个预设的12分钟时间边界从00:00开始,刚好在12:00前结束。只有一个数据点(8.005),同时落在查询的第一个GROUP BY time()时间间隔和第一个时间边界内。请注意,虽然返回的时间戳发生在查询的时间范围开始之前,但是查询结果排除了在查询时间范围之前发生的数据。

第二个预设的12分钟时间边界从12:00开始,刚好在24:00前结束。只有一个数据点(7.887),同时落在查询的第二个GROUP BY time()时间间隔和第二个时间边界内。

高级GROUP BY time()语法允许用户修改TSDB For InfluxDB®的预设时间边界的开始时间。在高级语法章节中的示例将继续这里展示的查询,它将预设的时间边界向前偏移6分钟,以便TSDB For InfluxDB®返回:

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

高级的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):关于time_interval的详情,请查看基本的GROUP BY time()语法。

offset_interval(偏移间隔)是一个持续时间(duration),它将TSDB For InfluxDB®的预设时间边界向前或向后偏移。offset_interval可以是正数或者负数。

  • fill(<fill_option>):可选,它会改变不含数据的时间间隔的返回值。

覆盖范围:

高级的GROUP BY time()查询依赖time_intervaloffset_interval和TSDB For 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:00Z8.12
2015-08-18T00:06:00Z8.005
2015-08-18T00:12:00Z7.887
2015-08-18T00:18:00Z7.762
2015-08-18T00:24:00Z7.635
2015-08-18T00:30:00Z7.5
2015-08-18T00:36:00Z7.372
2015-08-18T00:42:00Z7.234
2015-08-18T00:48:00Z7.11
2015-08-18T00:54:00Z6.982

将查询结果按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:00Z7.884666666666667
2015-08-18T00:24:00Z7.502333333333333
2015-08-18T00:42:00Z7.108666666666667

该查询使用了InfluxQL中的一个函数计算water_level的平均值,将结果按18分钟的时间间隔进行分组,并将预设时间边界向前偏移6分钟。

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For 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:00Z7.946
2015-08-18T00:18:00Z7.6323333333333325
2015-08-18T00:36:00Z7.238666666666667
2015-08-18T00:54:00Z6.982

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For 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.0057.887

2015-08-18T00:00:00Z

2

time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z

time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z

7.7627.6357.5

2015-08-18T00:18:00Z

3

time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z

time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z

7.3727.2347.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开始,刚好在18:00前结束。有两个数据点(8.0057.887),同时落在查询的第一个GROUP BY time()时间间隔和第一个时间边界内。请注意,虽然返回的时间戳发生在查询的时间范围开始之前,但是查询结果排除了在查询时间范围之前发生的数据。

第二个预设的18分钟时间边界从18:00开始,刚好在36:00前结束。有三个数据点(7.7627.6357.5),同时落在查询的第二个GROUP BY time()时间间隔和第二个时间边界内。在这种情况下,边界时间范围和间隔时间范围是相同的。

第四个预设的18分钟时间边界从54:00开始,刚好在01: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

time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z

8.0057.8877.762

2015-08-18T00:06:00Z

2

time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z

time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z

7.6357.57.372

2015-08-18T00:24:00Z

3

time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z

time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z

7.2347.116.982

2015-08-18T00:42:00Z

4

time >= 2015-08-18T01:00:00Z AND time < 2015-08-18T01:18:00Z

NA

NA

NA

这个6分钟的偏移间隔将预设边界的时间范围向前偏移6分钟,使得边界的时间范围跟相关的GROUP BY time()间隔的时间范围始终相同。使用偏移间隔,每个时间间隔对三个数据点进行计算,并且返回的时间戳与边界时间范围的开始和GROUP BY time()时间范围的开始都相匹配。

请注意,offset_interval强制使第四个时间边界超过该查询的时间范围,因此,该查询不会返回最后一个时间间隔的数据。

将查询结果按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,-12m)

name: h2o_feet
time                   mean
--------
2015-08-18T00:06:00Z7.884666666666667
2015-08-18T00:24:00Z7.502333333333333
2015-08-18T00:42:00Z7.108666666666667

该查询使用了InfluxQL中的一个函数计算water_level的平均值,将结果按18分钟的时间间隔进行分组,并将预设时间边界向后偏移12分钟。

说明

该示例与前面第一个例子(将查询结果按18分钟的时间间隔进行分组并将预设时间边界向前偏移)的查询结果相同,但是,在该示例中,使用了一个负数的offset_interval,而在前面的示例中offset_interval是一个正数。这两个查询之间没有性能差异。在选择没有正负offset_interval时,请选择最直观的数值。

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For 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:00Z7.946
2015-08-18T00:18:00Z7.6323333333333325
2015-08-18T00:36:00Z7.238666666666667
2015-08-18T00:54:00Z6.982

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For 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.0057.887

2015-08-18T00:00:00Z

2

time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z

time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:36:00Z

7.7627.6357.5

2015-08-18T00:18:00Z

3

time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z

time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z

7.3727.2347.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开始,刚好在18:00前结束。有两个数据点(8.0057.887),同时落在查询的第一个GROUP BY time()时间间隔和第一个时间边界内。请注意,虽然返回的时间戳发生在查询的时间范围开始之前,但是查询结果排除了在查询时间范围之前发生的数据。

第二个预设的18分钟时间边界从18:00开始,刚好在36:00前结束。有三个数据点(7.7627.6357.5),同时落在查询的第二个GROUP BY time()时间间隔和第二个时间边界内。在这种情况下,边界时间范围和间隔时间范围是相同的。

第四个预设的18分钟时间边界从54:00开始,刚好在01: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

NA

NA

NA

2

time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z

time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:24:00Z

8.0057.8877.762

2015-08-18T00:06:00Z

3

time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z

time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00

7.6357.57.372

2015-08-18T00:24:00Z

4

time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z

time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z

7.2347.116.982

2015-08-18T00:42:00Z

这个负12分钟的偏移间隔将预设边界的时间范围向后偏移12分钟,使得边界的时间范围跟相关的GROUP BY time()间隔的时间范围始终相同。使用偏移间隔,每个时间间隔对三个数据点进行计算,并且返回的时间戳与边界时间范围的开始和GROUP BY time()时间范围的开始都相匹配。

请注意,offset_interval强制使第一个时间边界超过该查询的时间范围,因此,该查询不会返回第一个时间间隔的数据。

将查询结果按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,6m)

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

该查询使用了InfluxQL中的一个函数计算water_level的数据点数,将结果按12分钟的时间间隔进行分组,并将预设时间边界向前偏移6分钟。

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For 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:00Z1
2015-08-18T00:12:00Z1

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For 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-18T00:12:00Z AND time < 2015-08-18T00:24:00Z

time >= 2015-08-18T00:12:00Z AND time < 2015-08-18T00:18:00Z

7.887

2015-08-18T00:12:00Z

第一个预设的12分钟时间边界从00:00开始,刚好在12:00前结束。只有一个数据点(8.005),同时落在查询的第一个GROUP BY time()时间间隔和第一个时间边界内。请注意,虽然返回的时间戳发生在查询的时间范围开始之前,但是查询结果排除了在查询时间范围之前发生的数据。

第二个预设的12分钟时间边界从12:00开始,刚好在24:00前结束。只有一个数据点(7.887),同时落在查询的第二个GROUP BY time()时间间隔和第二个时间边界内。

对于有offset_interval的查询,时间边界和返回的时间戳符合指定的偏移时间边界:

时间间隔序号

预设的时间边界

GROUP BY time()时间间隔

包含的数据点

返回的时间戳

1

time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z

time >= 2015-08-18T00:06:00Z AND time < 2015-08-18T00:18:00Z

8.0057.887

2015-08-18T00:06:00Z

2

time >= 2015-08-18T00:18:00Z AND time < 2015-08-18T00:30:00Z

NA

NA

NA

这个6分钟的偏移间隔将预设边界的时间范围向前偏移6分钟,使得边界的时间范围跟相关的GROUP BY time()间隔的时间范围始终相同。使用偏移间隔,该查询返回一个结果,并且返回的时间戳与边界时间范围的开始和GROUP BY time()时间范围的开始都相匹配。

请注意,offset_interval强制使第二个时间边界超过该查询的时间范围,因此,该查询不会返回第二个时间间隔的数据。

GROUP BY time intervals和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 BY多个对象(例如,tag和时间间隔),那么fill()必须放在GROUP BY子句后面。

fill_option

  • 任意数值:对于没有数据点的时间间隔,返回这个给定的数值。

  • linear:对于没有数据点的时间间隔,返回线性插值的结果。

  • none:对于没有数据点的时间间隔,不返回任何时间戳和值。

  • null:对于没有数据点的时间间隔,返回时间戳,并且返回null作为该时间戳所对应的值,这跟默认的情况相同。

  • previous:对于没有数据点的时间间隔,返回前一个时间间隔的值。

示例1:没有使用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:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z

示例2:使用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
--------------
ime                   max
2015-09-18T16:00:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z100

fill(100)改变了没有数据点的时间间隔的值。第四个时间间隔本来没有数据显示,但是使用了fill(100)后,返回值变为了100。

示例3:没有使用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:00Z1
2016-11-11T21:12:00Z
2016-11-11T21:24:00Z3
2016-11-11T21:36:00Z
2016-11-11T21:48:00Z
2016-11-11T22:00:00Z6

示例4:使用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:00Z1
2016-11-11T21:12:00Z2
2016-11-11T21:24:00Z3
2016-11-11T21:36:00Z4
2016-11-11T21:48:00Z5
2016-11-11T22:00:00Z6

fill(linear)将没有数据点的时间间隔的返回值更改为线性插值的结果。

说明

示例二中的数据并不在数据库NOAA_water_database中。为了可以使用fill(linear),创建一个有更少常规数据的数据集。

示例5:没有使用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:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z

示例6:使用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:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235

fill(none)对于没有数据点的时间间隔,既不返回时间戳,也不返回值。

示例7:没有使用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:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z

示例8:使用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:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z

fill(null)对于没有数据点的时间间隔,返回null作为它的值。使用fill(null)的查询结果跟没有使用fill(null)的结果一样。

示例9:没有使用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:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z

示例10:使用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) fill(previous)

name: h2o_feet
--------------
time                   max
2015-09-18T16:00:00Z3.599
2015-09-18T16:12:00Z3.402
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z3.235

fill(previous)将没有数据点的时间间隔的返回值更改为3.235,跟上一个时间间隔的返回值一样。

fill()的常见问题

在查询时间范围内没有数据的情况下使用fill()

目前,如果在查询的时间范围内没有数据,那么查询会忽略fill()。这是符合预期的结果。

示例:

以下查询不会返回任何数据,因为water_level在查询的时间范围内没有任何数据点。请注意,fill(800)对以下查询结果无影响。

 SELECT MEAN("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >='2015-09-18T22:00:00Z' AND time <='2015-09-18T22:18:00Z' GROUP BY time(12m) fill(800)

在前一个结果不在查询时间范围内的情况下使用fill(previous)

如果前一个时间间隔超出查询的时间范围,那么fill(previous)不会填充该时间间隔所对应的值。

示例:

以下查询覆盖的时间范围是从2015-09-18T16:24:00Z2015-09-18T16:54:00Z。请注意,fill(previous)使用2015-09-18T16:24:00Z的结果来填充2015-09-18T16:36:00Z对应的值。

SELECT MAX("water_level") FROM "h2o_feet" WHERE location ='coyote_creek' AND time >='2015-09-18T16:24:00Z' AND time <='2015-09-18T16:54:00Z' GROUP BY time(12m) fill(previous)

name: h2o_feet
--------------
time                   max
2015-09-18T16:24:00Z3.235
2015-09-18T16:36:00Z3.235
2015-09-18T16:48:00Z4

下一个查询将缩短以上查询的时间范围,现在,查询覆盖的时间范围变为从2015-09-18T16:36:00Z2015-09-18T16:54:00Z。请注意,fill(previous)不会使用2015-09-18T16:24:00Z的结果来填充2015-09-18T16:36:00Z对应的值,因为2015-09-18T16:24:00Z不在查询较短的时间范围内。

SELECT MAX("water_level") FROM "h2o_feet" WHERE location ='coyote_creek' AND time >='2015-09-18T16:36:00Z' AND time <='2015-09-18T16:54:00Z' GROUP BY time(12m) fill(previous)

name: h2o_feet
--------------
time                   max
2015-09-18T16:36:00Z
2015-09-18T16:48:00Z4

在前一个或后一个结果不在查询时间范围内的情况下使用fill(linear)

如果前一个或后一个时间间隔超出查询的时间范围,那么fill(linear)不会填充(fill)该时间间隔所对应的值。

示例:

以下查询覆盖的时间范围是从2016-11-11T21:24:00Z2016-11-11T22:06:00Z。请注意,fill(linear)使用2016-11-11T21:24:00Z2016-11-11T22:00:00Z这两个时间间隔的值来填充2016-11-11T21:36:00Z2016-11-11T21:48:00Z分别所对应的值。

SELECT MEAN("tadpoles") FROM "pond" WHERE time >'2016-11-11T21:24:00Z' AND time <='2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)

name: pond
time                   mean
--------
2016-11-11T21:24:00Z3
2016-11-11T21:36:00Z4
2016-11-11T21:48:00Z5
2016-11-11T22:00:00Z6

下一个查询将缩短以上查询的时间范围,现在,查询覆盖的时间范围变为从2016-11-11T21:36:00Z2016-11-11T22:06:00Z。请注意,fill(linear)不会填充2016-11-11T21:36:00Z2016-11-11T21:48:00Z所对应的值,因为2016-11-11T21:24:00Z不在查询较短的时间范围内,TSDB For InfluxDB®无法进行线性插值计算。

SELECT MEAN("tadpoles") FROM "pond" WHERE time >='2016-11-11T21:36:00Z' AND time <='2016-11-11T22:06:00Z' GROUP BY time(12m) fill(linear)
name: pond
time                   mean
--------
2016-11-11T21:36:00Z
2016-11-11T21:48:00Z
2016-11-11T22:00:00Z6
说明

以上示例数据并不在数据库NOAA_water_database中。为了可以使用fill(linear),创建一个有更少常规数据的数据集。