首页 > 解决方案 > 计算重复状态的迭代次数

问题描述

更新:

我有一个记录批准工作流程状态的表格。该表如下所示:

NUMBER      STATUS          STATUS_DATE             

248033      Registration    2017-12-02 12:20:58.0       
248033      Processed       2017-12-04 11:29:16.0   
248033      Approve         2017-12-04 11:32:11.0   
248033      Approved        2017-12-04 16:27:45.0   
248033      Completed       2017-12-05 06:01:29.0   
248033      Registration    2017-12-07 10:02:16.0   
248033      Approve         2017-12-08 15:48:09.0   
248033      Processed       2017-12-08 16:15:00.0   
248033      Completed       2017-12-09 10:23:32.0   
248033      Registration    2018-07-20 16:49:25.0   
248033      Processed       2018-07-20 16:54:32.0   
248033      Completed       2018-07-25 11:41:59.0   
248033      Registration    2019-03-11 09:56:10.0   
248033      Processed       2019-03-11 09:56:11.0   
248033      Completed       2019-03-12 06:01:10.0   

我想计算文档被批准的次数(迭代/周期)。一个迭代总是以“REGISTRATION”开始,以“COMPLETED”结束。但是在这两种状态之间,可能会看到很多状态之间来回“翻转”。也可以省略 'Processed' 或 'Approve' 或 'Approved' 。

我想对批准迭代进行分组,如下所示:

NUMBER      STATUS          STATUS_DATE             ITERATION

248033      Registration    2017-12-02 12:20:58.0       1   
248033      Processed       2017-12-04 11:29:16.0       1
248033      Approve         2017-12-04 11:32:11.0       1
248033      Approved        2017-12-04 16:27:45.0       1
248033      Completed       2017-12-05 06:01:29.0       1
248033      Registration    2017-12-07 10:02:16.0       2
248033      Approve         2017-12-08 15:48:09.0       2
248033      Processed       2017-12-08 16:15:00.0       2
248033      Completed       2017-12-09 10:23:32.0       2
248033      Registration    2018-07-20 16:49:25.0       3
248033      Processed       2018-07-20 16:54:32.0       3
248033      Completed       2018-07-25 11:41:59.0       3
248033      Registration    2019-03-11 09:56:10.0       4
248033      Processed       2019-03-11 09:56:11.0       4
248033      Completed       2019-03-12 06:01:10.0       4

关于如何使用 Oracle SQL 实现这一点的任何想法?

标签: sqloracle

解决方案


OVER使用子句计算注册:

select
  number,
  status,
  status_date,
  count(case when status = 'Registration' then 1 end) over (order by status_date)
    as iteration
from mytable
order by status_date;

编辑:您说“注册”可以在“完成”之前多次发生。您可以改为计算“已完成”,并且仅在该行本身不是“已完成”行时才加 1。

select
  number,
  status,
  status_date,
  count(case when status = 'Completed' then 1 end) over (order by status_date) +
    case when status = 'Completed' then 0 else 1 end as iteration
from mytable
order by status_date;

推荐阅读