使用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)。
答案 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 0
和now()
作为较低和较高的时间范围边界,因此在{{1}中包含and time < now()
是多余的}。clause。)