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”状态。简单易行,正是我所需要的。非常感谢。