常见问题
本文档主要描述InfluxQL函数的常见问题。
所有函数
问题一:嵌套函数
部分InfluxQL函数支持在SELECT
子句中嵌套使用:
COUNT()
嵌套DISTINCT()
CUMULATIVE_SUM()
DERIVATIVE()
DIFFERENCE()
ELAPSED()
MOVING_AVERAGE()
NON_NEGATIVE_DERIVATIVE()
HOLT_WINTERS()
和HOLT_WINTERS_WITH_FIT()
对于其它函数,可以使用InfluxQL子查询来代替嵌套函数。请查看数据探索获得更多关于子查询的信息。
问题二:查询在now()之后的时间范围
大多数SELECT
语句的默认时间范围在1677-09-21 00:12:43.145224194
UTC和2262-04-11T23:47:16.854775806Z
UTC之间。对于包含InfluxQL函数和GROUP BY time()
子句的SELECT
查询,默认的时间范围在1677-09-21 00:12:43.145224194
和now()
之间。
如果要查询时间戳发生在now()
之后的数据,那么包含InfluxQL函数和GROUP BY time()
子句的SELECT
查询必须在WHERE
子句中提供一个时间上限。
聚合函数
问题一:理解返回的时间戳
对于使用聚合函数并且没有在WHERE
子句中指定时间范围的查询,系统会将epoch 0 (1970-01-01T00:00:00Z
)作为时间戳返回。TSDB For InfluxDB®使用epoch 0作为空时间戳。对于使用聚合函数并且在WHERE
子句中指定时间范围的查询,系统会将时间范围的下界作为时间戳返回。
示例1:使用聚合函数并且没有指定时间范围
> SELECT SUM("water_level") FROM "h2o_feet"
name: h2o_feet
time sum
-------
1970-01-01T00:00:00Z67777.66900000004
该查询将TSDB For InfluxDB®的空时间戳(epoch 0: 1970-01-01T00:00:00Z
)作为时间戳返回。SUM()
将多个数据点聚合,没有单个时间戳可以返回。
示例2:使用聚合函数并且指定时间范围
> SELECT SUM("water_level") FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z'
name: h2o_feet
time sum
-------
2015-08-18T00:00:00Z67777.66900000004
该查询将时间范围的下界WHERE time >= '2015-08-18T00:00:00Z'
作为时间戳返回。
示例3:使用聚合函数并且指定时间范围和使用GROUP BY time()
子句
> SELECT SUM("water_level") FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:18:00Z' GROUP BY time(12m)
name: h2o_feet
time sum
-------
2015-08-18T00:00:00Z20.305
2015-08-18T00:12:00Z19.802999999999997
该查询将每个GROUP BY time()
间隔的时间下界作为时间戳返回。
问题二:将聚合函数和不聚合的数据混合使用
聚合函数不支持在SELECT
语句中指定不使用聚合函数的单独的field key或tag key。聚合函数返回一个计算结果,对于没有被聚合的field或tag,没有明显的单个值可以返回。当SELECT
语句同时包含聚合函数和单独的field key或tag key时,会返回错误:
> SELECT SUM("water_level"),"location" FROM "h2o_feet"
ERR: error parsing query: mixing aggregate and non-aggregate queries is not supported
问题三:得到略有不同的结果
对于某些聚合函数,在相同的数据点(数据类型为float64)上执行相同的函数,可能会产生稍微不同的结果。在应用聚合函数之间,TSDB For InfluxDB®不会将数据点进行排序;该行为可能会导致查询结果中出现小小的差异。
Selector函数
问题一:理解返回的时间戳
selector函数返回的时间戳依赖查询中函数的数量和查询中的其它子句:
对于有单个selector函数、单个field key和没有GROUP BY time()
子句的查询,将会返回在原始数据中出现的数据点的时间戳。对于有单个selector函数、多个field key和没有GROUP BY time()
子句的查询,将会返回在原始数据中出现的数据点的时间戳或者TSDB For InfluxDB®的空时间戳(epoch 0:1970-01-01T00:00:00Z
)。对于有多个函数、多个field key和没有在GROUP BY time()
子句指定时间范围的查询,将会返回TSDB For InfluxDB®的空时间戳(epoch 0:1970-01-01T00:00:00Z
)。对于有多个函数、多个field key和在GROUP BY time()
子句指定时间范围的查询,将会返回时间范围的下界作为时间戳。对于有单个selector函数和GROUP BY time()
子句的查询,将会返回每个GROUP BY time()
间隔的时间下界作为时间戳。
当同时使用GROUP BY time()
子句时,SAMPLE()
函数跟其它selector函数不一样。
示例1:使用单个selector函数和单个field key,并且没有指定时间范围
> SELECT MAX("water_level") FROM "h2o_feet"
name: h2o_feet
time max
-------
2015-08-29T07:24:00Z9.964
> SELECT MAX("water_level") FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z'
name: h2o_feet
time max
-------
2015-08-29T07:24:00Z9.964
该查询返回原始数据中具有最大值的数据点的时间戳。
示例2:使用单个selector函数和多个field key,并且没有指定时间范围
> SELECT FIRST(*) FROM "h2o_feet"
name: h2o_feet
time first_level description first_water_level
--------------------------------------------
1970-01-01T00:00:00Z between 6 and 9 feet 8.12
> SELECT MAX(*) FROM "h2o_feet"
name: h2o_feet
time max_water_level
-------------------
2015-08-29T07:24:00Z9.964
第一个查询返回TSDB For InfluxDB®的空时间戳(epoch 0: 1970-01-01T00:00:00Z
)作为查询结果中的时间戳。因为FIRST(*)
返回两个时间戳(对应measurement h2o_feet
中的每个field key),所以系统使用空时间戳覆盖这两个时间戳。
第二个查询返回原始数据中具有最大值的数据点的时间戳。因为MAX(*)
只返回一个时间戳(measurement h2o_feet
中只有一个数值类型的field),所以系统不会覆盖原始时间戳。
示例3:使用多个selector函数,并且没有指定时间范围
> SELECT MAX("water_level"),MIN("water_level") FROM "h2o_feet"
name: h2o_feet
time max min
----------
1970-01-01T00:00:00Z9.964-0.61
该查询返回TSDB For InfluxDB®的空时间戳(epoch 0: 1970-01-01T00:00:00Z
)作为查询结果中的时间戳。因为MAX()
和MIN()
函数返回不同的时间戳,所以系统没有单个时间戳可以返回。
示例4:使用多个selector函数,并且指定时间范围
> SELECT MAX("water_level"),MIN("water_level") FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z'
name: h2o_feet
time max min
----------
2015-08-18T00:00:00Z9.964-0.61
该查询返回时间范围的下界WHERE time >= '2015-08-18T00:00:00Z'
作为查询结果中的时间戳。
示例5:使用单个selector函数,并且指定时间范围
> SELECT MAX("water_level") FROM "h2o_feet" WHERE time >='2015-08-18T00:00:00Z' AND time <='2015-08-18T00:18:00Z' GROUP BY time(12m)
name: h2o_feet
time max
-------
2015-08-18T00:00:00Z8.12
2015-08-18T00:12:00Z7.887
该查询返回每个GROUP BY time()
间隔的时间下界作为查询结果中的时间戳。