Sql 两行之间的差异,忽略某些行

Sql 两行之间的差异,忽略某些行,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一个晚上运行的工作流程,这取决于计划。有时成功,有时失败。当它失败的时候,我想知道它已经被关闭了多少天,但不包括它不被期待的那一天 我有以下输入数据: ID Date Status 1 20170616 KO 1 20170615 OK 1 20170614 OK 1 20170613 OK 1 20170612 KO 1 20170611 NO RUN 1 20170610

我有一个晚上运行的工作流程,这取决于计划。有时成功,有时失败。当它失败的时候,我想知道它已经被关闭了多少天,但不包括它不被期待的那一天

我有以下输入数据:

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
不运行意味着它没有运行,但这是预期的

我想:

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
我每天总是有一行。如有必要,可以删除“无运行”行,从而导致日期跳转

我可以通过lead功能获得最后一天的正常值,但如果不计算无运行天数,我无法成功地计算天数差

我试着用以下公式计算一个总数:

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

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

你知道怎么做吗


谢谢您的帮助。

我可以想出一种方法,使用两个级别的窗口功能:

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;

子查询定义由OKs分隔的行组。外部的
sum()
然后枚举每个组中的“KO”状态。

简单易行,正是我所需要的。非常感谢。