2017-06-16 80 views
1

根据规划,我有一个运行一夜的工作流程。有时会成功,有时不会。当它失败时,我想知道有多少天它一直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行,从而导致日期跳转。

我可以用主导函数得到最后一天的OK,但是我没有计算出没有计算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

我能想到的与窗函数的两个层面这样做的方式:

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

+0

简单而简单,正是我所需要的。谢谢。 – Ismedriel