两条线之间的区别,忽略一些线

Difference between two lines, ignoring some lines

我有一个 运行 晚上的工作流程,具体取决于计划。有时会成功,有时不会。失败的时候我想知道KO了多少天,但不包括没有预料到的那一天

我有以下输入数据:

ID    Date        Status
1     20170616    KO
1     20170615    OK
1     20170614    OK
1     20170613    OK
1     20170612    KO
1     20170611    NO RUN
1     20170610    NO RUN
1     20170609    KO
1     20170608    OK
1     20170607    KO
1     20170506    OK

NO 运行 表示它没有 运行,但它是预期的。

我想要:

ID    Date        Status       NbDayKO
1     20170616    KO           1
1     20170615    OK           0
1     20170614    NO RUN       0
1     20170613    OK           0
1     20170612    KO           2
1     20170611    NO RUN       1
1     20170610    NO RUN       1
1     20170609    KO           1
1     20170608    OK           0
1     20170607    KO           1
1     20170606    OK           0

我总是每天一行。如有必要,可以删除 NO 运行 行,从而导致日期跳转。

我可以通过 lead 函数得到最后一天,但是我没有成功计算天数差异,而不计算 NO 运行 天。

我尝试用 :

求和
sum(
CASE WHEN Status = 'KO' THEN 1
     WHEN Status = 'NO RUN' THEN 0
     ELSE NULL
END) over(partition by idStatus order by date)

我预计它会在每次遇到 OK 时将值重置为 NULL,但 sum 函数会忽略 NULL

我还尝试了其他几种方法,主要是基于分析查询,但没有成功。

知道怎么做吗?

感谢您的帮助。

我可以想出一种使用两层 window 函数来实现此目的的方法:

select t.*,
       sum(case when status = 'KO' then 1 else 0 end) over (partition by id, cume_ko order by date) as nbDayKO
from (select t.*,
             sum(case when status = 'OK' then 1 else 0 end) over (partition by id order by date) as cume_ko
      from t
     ) t;

子查询定义了由 OK 分隔的行组。然后外层 sum() 枚举每个组内的 'KO' 状态。