SUMIF 然后重新开始计数

SUMIF then restart count

我如何做一个 SUMIF 函数,以便它在另一列中的值为 "False" 时累加值,但当它达到 "True" 的值时,它会重新开始计数重来一次,但包括 SUM 计算中遇到的第一个 "True" 的值?我也想要它,以便它按时间顺序累加值。

我做了一些研究,我认为我需要使用一个过度分区并制作一个行号列来调用所有行号 =“1”,但我不确定该怎么做。

编辑:Sum 还应该包括它遇到的第一个 "true" 值的 "distance" 值

编辑 2:最终,我试图计算在警报被触发到 "True" 之前每辆车行驶的平均距离,这意味着它需要被带到商店进行修复。也许有比我最初想的更好的方法来做到这一点?

抱歉措辞不佳...

你认为可以使用 SUM 分析函数是对的。这样的事情会为你做累计和。 要在警报为 True 时重新启动 SUM,请在分区 window 中包含 Alter 并按日期排序以实现订单。

SELECT SUM(CASE WHEN alert = 'FALSE' THEN distance ELSE 0 END) OVER(PARTITIION BY alert order by date) cumm_sum,
       date, alert 
FROM Table

您要定义群组。听起来您希望定义为 "trues" 的数量,直到并包括给定的行。然后,您可以在每个组内进行累加和。所以:

select t.*,
       sum(distance) over (partition by vehicleid, grp
                           order by date
                           rows between unbounded preceding and current row  
                          )    
from (select t.*,
             sum(case when alert = 'True' then 1 else 0 end) over
                 (partition by vehicleid
                  order by date
                  rows between unbounded preceding and current row
                 ) as grp
      from t
     ) t;

Here 是一个 db<>fiddle,说明此代码有效。