两条线之间的区别,忽略一些线
Difference between two lines, ignoring some lines
我有一个 运行 晚上的工作流程,具体取决于计划。有时会成功,有时不会。失败的时候我想知道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 运行 表示它没有 运行,但它是预期的。
我想要:
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 运行 行,从而导致日期跳转。
我可以通过 lead 函数得到最后一天,但是我没有成功计算天数差异,而不计算 NO 运行 天。
我尝试用 :
求和
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
我还尝试了其他几种方法,主要是基于分析查询,但没有成功。
知道怎么做吗?
感谢您的帮助。
我可以想出一种使用两层 window 函数来实现此目的的方法:
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' 状态。
我有一个 运行 晚上的工作流程,具体取决于计划。有时会成功,有时不会。失败的时候我想知道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 运行 表示它没有 运行,但它是预期的。
我想要:
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 运行 行,从而导致日期跳转。
我可以通过 lead 函数得到最后一天,但是我没有成功计算天数差异,而不计算 NO 运行 天。
我尝试用 :
求和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
我还尝试了其他几种方法,主要是基于分析查询,但没有成功。
知道怎么做吗?
感谢您的帮助。
我可以想出一种使用两层 window 函数来实现此目的的方法:
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' 状态。