我可以计算 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天,这不是问题。
如果这是一个问题,有一些解决方法。一个可能比听起来更棘手的方法:确保每天都有一个条目。
更稳健的方法是让报告应用分两步执行此操作。类似这样的事情(还没有弄清楚所有的细节,但你明白了):
- 查找过去 30 天的数据点数,使用
select count(field_name) from measurement where time > now() - 30d
. 这样的查询
- 使用这个数字(称之为
n
)来构成查询:select n*moving_average(field_name, n) from measurement where time > now - 30d
.
我想了解是否可以在我的一项测量中计算 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天,这不是问题。
如果这是一个问题,有一些解决方法。一个可能比听起来更棘手的方法:确保每天都有一个条目。
更稳健的方法是让报告应用分两步执行此操作。类似这样的事情(还没有弄清楚所有的细节,但你明白了):
- 查找过去 30 天的数据点数,使用
select count(field_name) from measurement where time > now() - 30d
. 这样的查询
- 使用这个数字(称之为
n
)来构成查询:select n*moving_average(field_name, n) from measurement where time > now - 30d
.