sql - 进程/事务数据分区
问题描述
我对从我们的工作流系统中获得的流程数据进行分区时遇到问题。对于几个进程(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 by
但partition by
没有成功 - 我不知道如何拆分中间给定 x 的数据。你有什么主意吗?
解决方案
我会用定义迭代的窗口总和来解决这个问题。每次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
身份证 | 迭代 | 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
推荐阅读
- css - 手动切换暗模式 - SASS - SCSS
- typescript - 具有通用交叉点类型的奇怪行为
- authentication - 有什么方法可以将放大与 nuxtjs/Vue 一起使用?
- next.js - 如何禁用 Netlify 错误页面并使用自定义错误页面而不是 NextJS?
- python - 如何将图像数据集转换为 pkl 文件
- c# - 将会话中的对象清空会立即将其销毁
- javascript - 使用 Nuxt 2 组合 API 来获取模板 refs 数组
- python - 使用 win32com 实例化并使用用户定义的 vba 对象
- javascript - 如何将用户收到的多个值保存在 localStorage 中?
- firebase - Firebase 从哪个步骤开始按 AB-test 中的变体拆分流量