2017-06-16 84 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