InfluxDB平均值随着时间的推移而不同

时间:2016-02-19 18:07:44

标签: influxdb

使用Influx DB v0.9,说我有这个简单的查询:

select count(distinct("id")) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(1m)

结果如下:

08:00 5
08:01 10
08:02 5
08:03 10
08:04 5

现在我想要一个查询,产生平均值超过5分钟的点。所以这些点现在相隔5分钟而不是1分钟,但是是1分钟值的平均值。所以上述5点为1点,结果为(5 + 10 + 5 + 10 + 5)/ 5。

为了清楚起见,这不会产生我所追求的结果,因为这只是一个计数,而我是在平均值之后。

select count(distinct("id")) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(5m)

这不起作用(给出错误):

select mean(distinct("id")) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(5m)

也不起作用(给出错误):

select mean(count(distinct("id"))) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(5m)

在我的实际使用中&#34; id&#34;是一个字符串(内容,而不是标签,因为我的InfluxDB版本中的标签不支持count)。

1 个答案:

答案 0 :(得分:3)

为了向读者阐明几点,在InfluxQL中,COUNT()DISTINCT()等函数只能接受字段,而不能接受标记。此外,虽然COUNT()支持DISTINCT()函数的嵌套,但大多数嵌套或子函数尚不支持。此外,不支持嵌套查询,子查询或存储过程。

但是,有一种方法可以使用连续查询来满足您的需求,这是一种自动处理数据并将这些结果写回数据库的方法。

首先获取原始查询并将其设为continuous query(CQ)。

CREATE CONTINUOUS QUERY count_foo ON my_database_name BEGIN SELECT COUNT(DISTINCT("id")) AS "1m_count" INTO main_1m_count FROM "main" GROUP BY time(1m) END

CQ还有其他选项,但基本的选项会每分钟唤醒一次,计算前一分钟的COUNT(DISTINCT("id")),然后将结果存储到新的测量值main_1m_count中。

现在,您可以轻松地计算出main_1m_count中预先计算的1分钟COUNT个结果的5分钟平均COUNT:

SELECT MEAN("1m_count") FROM main_1m_count WHERE time > now() - 30m GROUP BY time(5m)

(注意by default,InfluxDB使用epoch 0now()作为较低和较高的时间范围边界,因此在{{1}中包含and time < now()是多余的}。clause。)