InfluxDB 随时间变化的不同计数的平均值

ese*_*elk 2 influxdb

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

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

给出的结果如下:

08:00 5
08:01 10
08:02 5
08:03 10
08:04 5
Run Code Online (Sandbox Code Playgroud)

现在我想要一个查询,该查询可以生成 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

bec*_*ean 5

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

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

首先获取原始查询并将其设为连续查询(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

现在,您可以根据预先计算的 1 分钟 COUNT 结果轻松计算 5 分钟平均 COUNT main_1m_count

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

(请注意,默认情况下,InfluxDB 使用epoch 0now()作为时间范围的下限和上限,因此包含and time < now()在该WHERE子句中是多余的。)