Oracle查询实现案件流转行合并 输出TRANSFER_FROM/TRANSFER_TO列
Oracle 案件用户流转关系统计查询实现
基础信息
- 源表为案件操作事件全量表,核心字段如下:
case_nbr:案件编号event_id:事件唯一ID,随操作发生时间递增event_desc:事件操作描述User_ID:操作人账号ID
- 输出要求:返回字段为
case_nbr、TRANSFER_FROM(流转来源用户)、TRANSFER_TO(流转目标用户);同一用户连续操作不生成流转记录,仅在操作人发生变更时生成流转边,案件首条操作记录的来源用户为空。
实现思路
用Oracle窗口函数LAG()按案件分组、操作顺序排序,取每条记录的上一任操作人,过滤掉当前操作人和上一任操作人相同的冗余记录,剩下的结果就是完整的用户流转链路。
注意:如果
event_id无法严格对应操作先后顺序,可将排序字段替换为事件实际发生时间字段。如果存在讨论、办结这类不改变案件所属权的事件,可提前加where条件过滤,减少计算量。
可直接运行的查询语句
WITH event_with_pre_user AS ( SELECT case_nbr, User_ID, -- 分区取同案件上一条操作的操作人 LAG(User_ID) OVER ( PARTITION BY case_nbr ORDER BY event_id ASC ) AS last_op_user FROM your_case_event_table -- 替换为实际的事件表名 -- 按需添加过滤条件,例: -- WHERE event_desc NOT IN ('发起讨论','办结') ) SELECT case_nbr, last_op_user AS TRANSFER_FROM, User_ID AS TRANSFER_TO FROM event_with_pre_user -- 仅保留操作人发生变更的节点 WHERE last_op_user IS NULL OR last_op_user <> User_ID;
样例匹配验证
针对案件号201的11条测试数据,执行上述语句后会返回3条符合预期的记录:
- 案件首条操作人为U67800,无前置操作人,返回
(201, NULL, U67800) - 第一次操作人变更为U67999时,返回
(201, U67800, U67999) - 第二次操作人变更为U11800时,返回
(201, U67999, U11800)
内容的提问来源于stack exchange,提问作者CreationSL
相关产品推荐
相关产品推荐

