在 SQL (maria DB) 中根据时间对值存储进行分组,直到为零并与计数一起进行求和

Group values stores against time in SQL (maria DB) until Zero and do a summation along with count

我有 SQL table,其中有针对变量(唯一键)以 15 分钟间隔存储的数据。对于每个时间间隔,该值可以是任何数字,包括零。想要根据唯一键将值分组直到零。

就像如果值是 0,0,100,900,30,0,0,0,400,900,100,0,0,0,0,400,500,0,0 随着时间的推移想要添加值直到零(例如 sum as 1030, 1400, 900 , ... ) 针对每个唯一键并计算值不为零的实例数(例如在本例中为 3 等等)。

我们将数据存储在 SQL (mariaDB) 中(间隔 15 分钟)。现在这个数据决定了一个实体的性能,它是秒(比如 15 分钟间隔内的秒数,它有问题,它可以取 0 到 900 之间的任何值)。现在我们可以在任何时间间隔内对它们进行分组,并轻松绘制受影响的总秒数

Parameter_health 数据库包含两个 table --

  1. Parameter_detail table包含针对参数的固定数据信息
  2. Parameter_uasvalue table 包含该参数每 15 分钟间隔的不可用秒数 (UAS)

我使用了下面的 SQL 查询,它是分组在一起的总 UAS 的总和,但我想将它们分组到下一个零值,并计算此类事件的总实例(不是非零事件,但不为零时的总事件)对于任何时间间隔。

在 Grafana 中使用以下查询

SELECT parameter_detail.system, parameter_detail.parameter_label, sum(parameter_uasvalue.uas) as 'Total UAS'
FROM parameter_health.parameter_uasvalue left join parameter_health.parameter_detail on parameter_detail.id=parameter_uasvalue.id
WHERE $__timeFilter(parameter_uasvalue.time) and parameter_uasvalue.uas != '-1' and parameter_uasvalue.uas !=' 0' 
GROUP BY parameter_detail.system, parameter_detail.parameter_label

想要对每个值进行分组直到为零(进行求和),然后在 sql 查询中对任何时间间隔的此类实例进行计数。 Table parameter_uasvalue table 的结构如下所示

id  time    uas
Parameter-Unique Value1 15/11/2021 0:00 0
Parameter-Unique Value1 15/11/2021 0:15 100
Parameter-Unique Value1 15/11/2021 0:30 900
Parameter-Unique Value1 15/11/2021 0:45 30
Parameter-Unique Value1 15/11/2021 1:00 0
Parameter-Unique Value1 15/11/2021 1:15 0
Parameter-Unique Value1 15/11/2021 1:30 400
Parameter-Unique Value1 15/11/2021 1:45 900
Parameter-Unique Value1 15/11/2021 2:00 0
Parameter-Unique Value1 15/11/2021 2:15 0
Parameter-Unique Value1 15/11/2021 2:30 0
Parameter-Unique Value1 15/11/2021 2:45 400
Parameter-Unique Value1 15/11/2021 3:00 500
Parameter-Unique Value1 15/11/2021 3:15 0
Parameter-Unique Value1 15/11/2021 3:30 0
Parameter-Unique Value1 15/11/2021 3:45 0

enter image description here

这是一种间隙和孤岛问题。首先处理和分组 parameter_uasvalue 数据然后加入 Parameter_detail.

SELECT d.system, d.parameter_label, seriesStart, s, nonzc 
from (
    select id, min(time) seriesStart, sum(uas) s, count(case when uas > 0 then uas end) nonzc
    from (
      select id, time, uas, sum(flag) over(partition by id order by  time) grp
      from (
        select id, time, uas, (coalesce(lag(uas, 1) over(partition by id order by  time),0) = 0 and uas != 0) flag
        from parameter_health.parameter_uasvalue t
        where $__timeFilter(time) and uas != -1 
          -- it will break series detection 
          -- and uas != 0
      ) t
    ) t
    group by id, grp
) t
left join parameter_health.parameter_detail d on d.id=t.id
order by d.system, d.parameter_label, seriesStart;

Grouping demo