两条线之间的差异,忽略了一些线条

时间:2017-06-16 18:53:51

标签: sql oracle oracle10g

我有一个工作流程,根据计划运行一夜。有时它成功,有时不成功。当它失败时,我想知道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 RUN意味着它没有运行,但它是预期的。

我想要:

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 RUN行,导致日期跳转。

我可以通过主导功能获得最后一天的确定,但是如果没有计算无运行天数,我就无法完成天数差异。

我试着用:

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

我还尝试了其他一些事情,主要是基于分析查询,但没有成功。

关于如何做到这一点的任何想法?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我可以想办法用两级窗口函数来做到这一点:

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'状态。