全部产品
Search
文档中心

GROUP BY子句

更新时间: 2020-07-02

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

GROUP BY tags

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

语法

  1. 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对查询结果进行分组

  1. > SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"
  2. name: h2o_feet
  3. tags: location=coyote_creek
  4. time mean
  5. ---- ----
  6. 1970-01-01T00:00:00Z 5.359342451341401
  7. name: h2o_feet
  8. tags: location=santa_monica
  9. time mean
  10. ---- ----
  11. 1970-01-01T00:00:00Z 3.530863470081006

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

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

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

  1. > SELECT MEAN("index") FROM "h2o_quality" GROUP BY location,randtag
  2. name: h2o_quality
  3. tags: location=coyote_creek, randtag=1
  4. time mean
  5. ---- ----
  6. 1970-01-01T00:00:00Z 50.69033760186263
  7. name: h2o_quality
  8. tags: location=coyote_creek, randtag=2
  9. time mean
  10. ---- ----
  11. 1970-01-01T00:00:00Z 49.661867544220485
  12. name: h2o_quality
  13. tags: location=coyote_creek, randtag=3
  14. time mean
  15. ---- ----
  16. 1970-01-01T00:00:00Z 49.360939907550076
  17. name: h2o_quality
  18. tags: location=santa_monica, randtag=1
  19. time mean
  20. ---- ----
  21. 1970-01-01T00:00:00Z 49.132712456344585
  22. name: h2o_quality
  23. tags: location=santa_monica, randtag=2
  24. time mean
  25. ---- ----
  26. 1970-01-01T00:00:00Z 50.2937984496124
  27. name: h2o_quality
  28. tags: location=santa_monica, randtag=3
  29. time mean
  30. ---- ----
  31. 1970-01-01T00:00:00Z 49.99919903884662

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

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

  1. > SELECT MEAN("index") FROM "h2o_quality" GROUP BY *
  2. name: h2o_quality
  3. tags: location=coyote_creek, randtag=1
  4. time mean
  5. ---- ----
  6. 1970-01-01T00:00:00Z 50.69033760186263
  7. name: h2o_quality
  8. tags: location=coyote_creek, randtag=2
  9. time mean
  10. ---- ----
  11. 1970-01-01T00:00:00Z 49.661867544220485
  12. name: h2o_quality
  13. tags: location=coyote_creek, randtag=3
  14. time mean
  15. ---- ----
  16. 1970-01-01T00:00:00Z 49.360939907550076
  17. name: h2o_quality
  18. tags: location=santa_monica, randtag=1
  19. time mean
  20. ---- ----
  21. 1970-01-01T00:00:00Z 49.132712456344585
  22. name: h2o_quality
  23. tags: location=santa_monica, randtag=2
  24. time mean
  25. ---- ----
  26. 1970-01-01T00:00:00Z 50.2937984496124
  27. name: h2o_quality
  28. tags: location=santa_monica, randtag=3
  29. time mean
  30. ---- ----
  31. 1970-01-01T00:00:00Z 49.99919903884662

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

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

GROUP BY time intervals

GROUP BY time()按用户指定的时间间隔对查询结果进行分组。

基本的GROUP BY time()语法

语法

  1. 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),决定了TSDB For InfluxDB®按多大的时间间隔将查询结果进行分组。例如,当time_interval5m时,那么在WHERE子句中指定的时间范围内,将查询结果按5分钟进行分组。

fill(<fill_option>)

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

覆盖范围:

基本的GROUP BY time()查询依赖time_interval和TSDB For InfluxDB®的预设时间边界来确定每个时间间隔内的原始数据和查询返回的时间戳。

基本语法示例

下面的示例将使用如下数据:

  1. > SELECT "water_level","location" FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'
  2. name: h2o_feet
  3. --------------
  4. time water_level location
  5. 2015-08-18T00:00:00Z 8.12 coyote_creek
  6. 2015-08-18T00:00:00Z 2.064 santa_monica
  7. 2015-08-18T00:06:00Z 8.005 coyote_creek
  8. 2015-08-18T00:06:00Z 2.116 santa_monica
  9. 2015-08-18T00:12:00Z 7.887 coyote_creek
  10. 2015-08-18T00:12:00Z 2.028 santa_monica
  11. 2015-08-18T00:18:00Z 7.762 coyote_creek
  12. 2015-08-18T00:18:00Z 2.126 santa_monica
  13. 2015-08-18T00:24:00Z 7.635 coyote_creek
  14. 2015-08-18T00:24:00Z 2.041 santa_monica
  15. 2015-08-18T00:30:00Z 7.5 coyote_creek
  16. 2015-08-18T00:30:00Z 2.051 santa_monica

将查询结果按12分钟的时间间隔进行分组

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time count
  5. 2015-08-18T00:00:00Z 2
  6. 2015-08-18T00:12:00Z 2
  7. 2015-08-18T00:24:00Z 2

该查询使用了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进行分组

  1. > 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"
  2. name: h2o_feet
  3. tags: location=coyote_creek
  4. time count
  5. ---- -----
  6. 2015-08-18T00:00:00Z 2
  7. 2015-08-18T00:12:00Z 2
  8. 2015-08-18T00:24:00Z 2
  9. name: h2o_feet
  10. tags: location=santa_monica
  11. time count
  12. ---- -----
  13. 2015-08-18T00:00:00Z 2
  14. 2015-08-18T00:12:00Z 2
  15. 2015-08-18T00:24:00Z 2

该查询使用了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()中的时间间隔和系统的预设时间边界来确定每个时间间隔内的原始数据和查询返回的时间戳。在某些情况下,这可能会导致意想不到的结果。

示例

原始数据:

  1. > SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:18:00Z'
  2. name: h2o_feet
  3. --------------
  4. time water_level
  5. 2015-08-18T00:00:00Z 8.12
  6. 2015-08-18T00:06:00Z 8.005
  7. 2015-08-18T00:12:00Z 7.887
  8. 2015-08-18T00:18:00Z 7.762

查询和结果:

以下查询覆盖的时间范围是12分钟,并将结果按12分钟的间隔进行分组,但是它返回了两个结果:

  1. > 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)
  2. name: h2o_feet
  3. time count
  4. ---- -----
  5. 2015-08-18T00:00:00Z 1 <----- Note that this timestamp occurs before the start of the query's time range
  6. 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®返回:

  1. name: h2o_feet
  2. time count
  3. ---- -----
  4. 2015-08-18T00:06:00Z 2

高级的GROUP BY time()语法

语法

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

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

覆盖范围:

高级的GROUP BY time()查询依赖time_intervaloffset_interval和TSDB For InfluxDB®的预设时间边界来确定每个时间间隔内的原始数据和查询返回的时间戳。

高级语法示例

下面的示例将使用如下数据:

  1. > SELECT "water_level" FROM "h2o_feet" WHERE "location"='coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:54:00Z'
  2. name: h2o_feet
  3. --------------
  4. time water_level
  5. 2015-08-18T00:00:00Z 8.12
  6. 2015-08-18T00:06:00Z 8.005
  7. 2015-08-18T00:12:00Z 7.887
  8. 2015-08-18T00:18:00Z 7.762
  9. 2015-08-18T00:24:00Z 7.635
  10. 2015-08-18T00:30:00Z 7.5
  11. 2015-08-18T00:36:00Z 7.372
  12. 2015-08-18T00:42:00Z 7.234
  13. 2015-08-18T00:48:00Z 7.11
  14. 2015-08-18T00:54:00Z 6.982

将查询结果按18分钟的时间间隔进行分组并将预设时间边界向前偏移

  1. > 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)
  2. name: h2o_feet
  3. time mean
  4. ---- ----
  5. 2015-08-18T00:06:00Z 7.884666666666667
  6. 2015-08-18T00:24:00Z 7.502333333333333
  7. 2015-08-18T00:42:00Z 7.108666666666667

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

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For InfluxDB®预设的时间边界。我们先来看看没有offset_interval的查询结果:

  1. > 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)
  2. name: h2o_feet
  3. time mean
  4. ---- ----
  5. 2015-08-18T00:00:00Z 7.946
  6. 2015-08-18T00:18:00Z 7.6323333333333325
  7. 2015-08-18T00:36:00Z 7.238666666666667
  8. 2015-08-18T00:54:00Z 6.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 <—-same 7.7627.6357.5 2015-08-18T00:18:00Z
3 time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z <—-same 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 <—-same 8.0057.8877.762 2015-08-18T00:06:00Z
2 time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z <—-same 7.6357.57.372 2015-08-18T00:24:00Z
3 time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z <—-same 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分钟的时间间隔进行分组并将预设时间边界向后偏移

  1. > 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)
  2. name: h2o_feet
  3. time mean
  4. ---- ----
  5. 2015-08-18T00:06:00Z 7.884666666666667
  6. 2015-08-18T00:24:00Z 7.502333333333333
  7. 2015-08-18T00:42:00Z 7.108666666666667

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

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

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For InfluxDB®预设的时间边界。我们先来看看没有offset_interval的查询结果:

  1. > 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)
  2. name: h2o_feet
  3. time mean
  4. ---- ----
  5. 2015-08-18T00:00:00Z 7.946
  6. 2015-08-18T00:18:00Z 7.6323333333333325
  7. 2015-08-18T00:36:00Z 7.238666666666667
  8. 2015-08-18T00:54:00Z 6.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 <—-same 7.7627.6357.5 2015-08-18T00:18:00Z
3 time >= 2015-08-18T00:36:00Z AND time < 2015-08-18T00:54:00Z <—-same 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 <—-same 8.0057.8877.762 2015-08-18T00:06:00Z
3 time >= 2015-08-18T00:24:00Z AND time < 2015-08-18T00:42:00Z <—-same 7.6357.57.372 2015-08-18T00:24:00Z
4 time >= 2015-08-18T00:42:00Z AND time < 2015-08-18T01:00:00Z <—-same 7.2347.116.982 2015-08-18T00:42:00Z

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

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

将查询结果按12分钟的时间间隔进行分组并将预设时间边界向前偏移

这个例子是基本语法的常见问题章节中示例的延续。

  1. > 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)
  2. name: h2o_feet
  3. time count
  4. ---- -----
  5. 2015-08-18T00:06:00Z 2

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

对于没有offset_interval的查询,时间边界和返回的时间戳依旧沿用TSDB For InfluxDB®预设的时间边界。我们先来看看没有offset_interval的查询结果:

  1. > 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)
  2. name: h2o_feet
  3. time count
  4. ---- -----
  5. 2015-08-18T00:00:00Z 1
  6. 2015-08-18T00:12:00Z 1

对于没有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 <—-same 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()(填充函数)改变不包含数据的时间间隔的返回值。

语法

  1. 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:对于没有数据点的时间间隔,返回前一个时间间隔的值

示例

示例一:没有使用fill(100)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235
  8. 2015-09-18T16:36:00Z

示例一:使用fill(100)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. ime max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235
  8. 2015-09-18T16:36:00Z 100

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

示例二:没有使用fill(linear)

  1. > SELECT MEAN("tadpoles") FROM "pond" WHERE time >= '2016-11-11T21:00:00Z' AND time <= '2016-11-11T22:06:00Z' GROUP BY time(12m)
  2. name: pond
  3. time mean
  4. ---- ----
  5. 2016-11-11T21:00:00Z 1
  6. 2016-11-11T21:12:00Z
  7. 2016-11-11T21:24:00Z 3
  8. 2016-11-11T21:36:00Z
  9. 2016-11-11T21:48:00Z
  10. 2016-11-11T22:00:00Z 6

示例二:使用fill(linear)

  1. > 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)
  2. name: pond
  3. time mean
  4. ---- ----
  5. 2016-11-11T21:00:00Z 1
  6. 2016-11-11T21:12:00Z 2
  7. 2016-11-11T21:24:00Z 3
  8. 2016-11-11T21:36:00Z 4
  9. 2016-11-11T21:48:00Z 5
  10. 2016-11-11T22:00:00Z 6

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

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

示例三:没有使用fill(none)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235
  8. 2015-09-18T16:36:00Z

示例三:使用fill(none)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235

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

示例四:没有使用fill(null)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235
  8. 2015-09-18T16:36:00Z

示例四:使用fill(null)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235
  8. 2015-09-18T16:36:00Z

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

示例五:没有使用fill(previous)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235
  8. 2015-09-18T16:36:00Z

示例五:使用fill(previous)

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:00:00Z 3.599
  6. 2015-09-18T16:12:00Z 3.402
  7. 2015-09-18T16:24:00Z 3.235
  8. 2015-09-18T16:36:00Z 3.235

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

fill()的常见问题

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

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

例子

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

  1. > 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)
  2. >

在前一个结果不在查询时间范围内的情况下使用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对应的值。

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:24:00Z 3.235
  6. 2015-09-18T16:36:00Z 3.235
  7. 2015-09-18T16:48:00Z 4

下一个查询将缩短以上查询的时间范围,现在,查询覆盖的时间范围变为从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不在查询较短的时间范围内。

  1. > 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)
  2. name: h2o_feet
  3. --------------
  4. time max
  5. 2015-09-18T16:36:00Z
  6. 2015-09-18T16:48:00Z 4

在前一个或后一个结果不在查询时间范围内的情况下使用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分别所对应的值。

  1. > 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)
  2. name: pond
  3. time mean
  4. ---- ----
  5. 2016-11-11T21:24:00Z 3
  6. 2016-11-11T21:36:00Z 4
  7. 2016-11-11T21:48:00Z 5
  8. 2016-11-11T22:00:00Z 6

下一个查询将缩短以上查询的时间范围,现在,查询覆盖的时间范围变为从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®无法进行线性插值计算。

  1. > 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)
  2. name: pond
  3. time mean
  4. ---- ----
  5. 2016-11-11T21:36:00Z
  6. 2016-11-11T21:48:00Z
  7. 2016-11-11T22:00:00Z 6

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


InfluxDB® is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB®.