我有一个工作流程,根据计划运行一夜。有时它成功,有时不成功。当它失败时,我想知道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
我还尝试了其他一些事情,主要是基于分析查询,但没有成功。
关于如何做到这一点的任何想法?
感谢您的帮助。
答案 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'状态。