常见问题

更新时间:

本文档主要描述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.145224194now()之间。

如果要查询时间戳发生在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()间隔的时间下界作为查询结果中的时间戳。