首页 > 解决方案 > 进程/事务数据分区

问题描述

我对从我们的工作流系统中获得的流程数据进行分区时遇到问题。对于几个进程(id)和事件的日期,数据一步一步地存储在数据库中(一步是一行)。简化数据如下:

id     step    date
1       a       2019-12-01
1       a       2019-12-02
1       b       2019-12-02
1       x       2019-12-03
1       a       2019-12-04
1       b       2019-12-05
2       a       2019-12-05
2       b       2019-12-06

我需要的是这么短的桌子

id  iteration   first step-a       first step-b
1    1           2019-12-01         2019-12-02
1    2           2019-12-04         2019-12-05
2    1           2019-12-05         2019-12-06

“x”步骤是返回步骤。它触发整个过程从头开始,因此将数据传输到小表#2 我需要在 2 次迭代中拆分 id=1 的过程。可能有乘以 a 和 b 步骤,但您需要选择第一个。

我尝试过group bypartition by没有成功 - 我不知道如何拆分中间给定 x 的数据。你有什么主意吗?

标签: sqloracle

解决方案


我会用定义迭代的窗口总和来解决这个问题。每次x给定的 a 满足时,都会id开始新的迭代。

select
    id,
    iteration,
    min(case when step = 'a' then mdate end) first_step_a,
    min(case when step = 'b' then mdate end) first_step_b
from (
    select 
        t.*,
        1 + sum(case when step = 'x' then 1 else 0 end) 
            over(partition by id order by mdate) iteration
    from mytable t
) t
group by id, iteration
order by id, iteration

DB Fiddle 上的演示

身份证 | 迭代 | FIRST_STEP_A | FIRST_STEP_B
-: | --------: | :----------- | :-----------
 1 | 1 | 2019-12-01 | 2019-12-02  
 1 | 2 | 2019-12-04 | 2019-12-05  
 2 | 1 | 2019-12-05 | 2019-12-06  

推荐阅读