2016-02-19 99 views
1

使用DB潮V0.9,说我有这个简单的查询:InfluxDB平均随着时间的推移

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点将是(5 + 10 + 5 + 10 + 5)/ 5的结果的值为1分。

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

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) 

在我的实际使用情况 “ID” 是字符串(内容,而不是标签,因为在我的InfluxDB版本中,标记数不同,不支持)。

回答

1

为了阐明读者的几点,在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

现在,你可以很容易地计算出的5张分钟也可预先1算出分钟计数结果平均计数在main_1m_count

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

(注意by default,InfluxDB使用epoch 0now()为低,上限时间范围边界,因此在WHERE条款中包含and time < now()是多余的。)

相关问题