InfluxDB:从cumulative_sum和non_negative_difference

时间:2018-06-06 09:48:32

标签: influxdb

使用InfluxDB,我尝试生成一个输出,显示从零开始的一段时间内的累积降雨量。

降雨量传感器输出累积降雨量,但在停电,重启等时重置为零。

我的第一个查询组件使用non_negative_difference()来显示增量。

select 
    non_negative_difference(rain) as nnd 
FROM 
    weather  
WHERE 
    $time_query

....每个原始数据点产生一个增量,例如:

2018-06-01T14:21:00.926Z 0
2018-06-01T14:22:02.959Z 0.30000000000000426
2018-06-01T14:23:04.992Z 0.3999999999999986
2018-06-01T14:24:07.024Z 0.10000000000000142
2018-06-01T14:25:09.059Z 0.19999999999999574
2018-06-01T14:26:11.094Z 0
2018-06-01T14:27:13.127Z 0.10000000000000142
2018-06-01T14:28:15.158Z 0.20000000000000284
2018-06-01T14:29:20.027Z 0.09999999999999432
2018-06-01T14:30:22.476Z 0.10000000000000142
2018-06-01T14:30:53.918Z 0.6000000000000014
2018-06-01T14:31:55.968Z 0.5
2018-06-01T14:32:58.007Z 0.5
2018-06-01T14:34:00.046Z 0.20000000000000284
2018-06-01T14:35:02.075Z 0.3999999999999986
2018-06-01T14:36:04.102Z 0.3999999999999986
2018-06-01T14:37:06.136Z 0.20000000000000284
2018-06-01T14:38:08.201Z 0

到目前为止一切顺利。

我现在正试图将这些读数重新计算为累计总数,从预期的零点开始。

我可以使用cumulative_sum(),例如:

SELECT 
    cumulative_sum(nnd) 
FROM 
    (SELECT 
        non_negative_difference(rain) as nnd 
     FROM 
        weather
     WHERE 
        $time_query )

产生:

2018-06-01T14:21:00.926Z 0
2018-06-01T14:22:02.959Z 0.30000000000000426
2018-06-01T14:23:04.992Z 0.7000000000000028
2018-06-01T14:24:07.024Z 0.8000000000000043
2018-06-01T14:25:09.059Z 1
2018-06-01T14:26:11.094Z 1
2018-06-01T14:27:13.127Z 1.1000000000000014
2018-06-01T14:28:15.158Z 1.3000000000000043
2018-06-01T14:29:20.027Z 1.3999999999999986
2018-06-01T14:30:22.476Z 1.5
2018-06-01T14:30:53.918Z 2.1000000000000014
2018-06-01T14:31:55.968Z 2.6000000000000014
2018-06-01T14:32:58.007Z 3.1000000000000014
2018-06-01T14:34:00.046Z 3.3000000000000043
2018-06-01T14:35:02.075Z 3.700000000000003
2018-06-01T14:36:04.102Z 4.100000000000001
2018-06-01T14:37:06.136Z 4.300000000000004
2018-06-01T14:38:08.201Z 4.300000000000004

看起来不错!

现在我想将它分组到更独特的时间段中,以获得漂亮的图形。

让我们试试......

SELECT 
    cumulative_sum(max(nnd))
FROM (SELECT 
          non_negative_difference(rain) as nnd 
      FROM 
          weather
      WHERE
          $time_query)
GROUP BY
    time(5m)

我收到错误:ERR: aggregate function required inside the call to non_negative_difference

但是我找不到合理的方法来向non_negative_difference()添加聚合和分组,这些方法不会影响差异函数本身的准确性。

我唯一能做的就是虚拟聚合SUM()随时间变化,小于传感器周期。但这并不足以满足我的喜好 - (我还不确定它是100%正确的)

我必须将两个查询都作为聚合查询吗?

1 个答案:

答案 0 :(得分:0)

我正尝试为我的气象站执行此操作。我不想让气象站计算累计值,而是希望Grafana做到这一点。最有效的解决方案是Yuri Lachin在其评论中提到的高级语法。

使用InfluxDB,您可以使用CUMULATIVE_SUM(),但是基本语法不允许您按时间分组(仅按标签分组)。但是,“高级语法”使您可以通过嵌套MEAN()SUM()之类的聚合函数来获得时间序列。

这是我在Grafana中使用的功能,用于获取选定时间段内的累计降雨总量: SELECT CUMULATIVE_SUM(MEAN("rainfall")) FROM "weather" WHERE $timeFilter GROUP BY time(1h) fill(0)

GROUP BY当然是灵活的。我对每小时降雨量感兴趣,所以我按1小时分组。您可以按自己感兴趣的时间段进行分组。

使用此查询,在Grafana中选择的期间,降雨将从零开始。在西雅图地区,我们分别在2020年8月6日和2020年8月8日有可测量的降雨(我知道,令人震惊)。如果我将日期范围设置为包括两个日期,则该图显示的总降雨量不足0.2mm: Graph showing 3 day period with rainfall

如果我将图形切换到8/8和8/9,则总数不到1mm: Graph showing 1 day period with rainfall

注意:我也对查看各个铲斗提示感兴趣,因此在第二个Y轴上将这些提示包括为条形。

Grafana query examples for rainfall

有关更多详细信息,请参见:https://docs.influxdata.com/influxdb/v1.8/query_language/functions/#advanced-syntax-7