我可以计算 InfluxDB 中某个字段的移动总和吗?

Can I calculate a moving sum on a field in InfluxDB?

我想了解是否可以在我的一项测量中计算 1 个月的收入数据总和。对于每一天,我想要前 30 天的总和。

在InfluxDB中或者通过Grafana的查询接口可以实现吗?

是的,绝对有可能。 只需像这样设置查询的这一部分:

SELECT sum("value") FROM "YOUR_TAG_NAME"
WHERE $timeFilter GROUP BY time(30d) fill(null)

只需确保您的仪表板时间包括 Last 30 days(至少)。

移动平均值移动总和除以样本数。因此,如果您想要过去 30 个值的移动总和:

select 30*moving_average(field_name, 30) from measurement

编辑添加:

正如 Peter Halicky 在评论中指出的那样,这不是过去 30 天。这是过去的30个数据点。

如果您每天都有数据,那不是问题。

如果您丢失了一天的数据,您仍然会得到 30 个样本的平均值,但它会延伸 31 天而不是 30 天。

如果你其实并不关心日历,而是想知道activity的过去30天,这不是问题。

如果这是一个问题,有一些解决方法。一个可能比听起来更棘手的方法:确保每天都有一个条目。

更稳健的方法是让报告应用分两步执行此操作。类似这样的事情(还没有弄清楚所有的细节,但你明白了):

  1. 查找过去 30 天的数据点数,使用 select count(field_name) from measurement where time > now() - 30d.
  2. 这样的查询
  3. 使用这个数字(称之为 n)来构成查询:select n*moving_average(field_name, n) from measurement where time > now - 30d.