我找到了一个似乎可行的解决方案,我不确定它是否是最好的解决方案,但发布它可能对某人有用。这并不总是为第一个结果返回 0,因为在第一个间隔中可能会有一些计数器增量,但这确实符合我的要求。我返回原始值只是为了突出它在做什么。
编辑:我发现您需要设置 fill(previous) 来处理数据中的空白,否则最终结果将不准确,并且图表会意外跳跃。我还发现它可以很好地处理计数器重置,这就是我们需要 non_negative_derivative 的原因。
SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)), mean("waterTotalVolumeMeter") FROM "detailed_data"."water" WHERE time > now() - 12h GROUP BY time(1h) fill(previous)
name: water
time cumulative_sum mean
---- -------------- ----
1592600400000000000 5.993055555555543 416.29008746355686
1592604000000000000 13.93156424581008 423.9315642458101
1592607600000000000 22.368055555555543 432.36805555555554
1592611200000000000 33.77777777777777 443.77777777777777
1592614800000000000 40.361111111111086 450.3611111111111
1592618400000000000 94.57638888888891 504.5763888888889
1592622000000000000 138.69444444444446 548.6944444444445
1592625600000000000 144.27083333333337 554.2708333333334
1592629200000000000 154.91666666666663 564.9166666666666
1592632800000000000 159 569
1592636400000000000 229.09027777777783 639.0902777777778
1592640000000000000 324.88194444444446 734.8819444444445
1592643600000000000 375 785
我还发现这是唯一可以为单个统计数据提供准确结果的方法。如果我们想根据计数器显示某个时间间隔内消耗的东西的数量,那么合乎逻辑的方法是从最大值中减去最小值或使用扩展函数。这些都不适用于计数器重置。为了应对计数器重置,唯一的选择是将所有正增量相加,这就是这样做的。我发现了 3 种在单个统计数据中使用它的方法:
- 让查询保持原样,让 Grafana 发挥最大作用
SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)) AS X FROM "detailed_data"."water" WHERE time > now() -24h GROUP BY time(1h) fill(previous)
- 将原始查询作为子查询进行最大流入
SELECT MAX(X) FROM (SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)) AS X FROM "detailed_data"."water" WHERE time > now() - 24h GROUP BY time(1h) fill(previous))
- 像这样在 influx 中使用 sum:
SELECT SUM(X) FROM (SELECT non_negative_derivative(mean("waterTotalVolumeMeter"), 1h) AS X FROM "detailed_data"."water" WHERE time > now() - 24h GROUP BY time(1h) fill(previous))