Я нашел решение, которое, похоже, работает, я не уверен, что это лучшее решение, но отправляю его, поскольку оно может быть кому-то полезно. Это не всегда возвращает 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))
Используйте сумму в притоке следующим образом:
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))