now() - 30m and-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:07:04 25 4
gpt4 key购买 nike

使用 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)

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

最佳答案

为了向读者澄清几点,在 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() 作为时间范围的下限和上限,因此在 and time < now() 子句中包含 WHERE 是多余的。)

关于InfluxDB 随时间变化的不同计数的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com