T-SQL实现任务、步骤分组内重置行号 人员变更时生成对应ID
问题解决实现方案
核心问题分析
你当前使用的DENSE_RANK()逻辑只会给同一个任务下不同的处理人分配固定序号,无法识别同一处理人在后续流程中再次接手的相邻变更场景,这类场景属于SQL经典的间隙与孤岛问题,需要按操作顺序做相邻对比实现。
实现前提
你的任务历史表必须存在可以标记操作先后顺序的字段,比如操作时间operate_time、操作记录自增IDoperate_id,以下示例默认使用operate_id作为排序依据。
完整实现代码
SELECT TaskName, StepId, Person, operate_time, -- 累加变更标记得到最终的变更序号 SUM(change_flag) OVER ( PARTITION BY TaskName, StepId ORDER BY operate_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS change_id FROM ( SELECT *, -- 判断当前处理人和上一条是否不一致,不一致则标记为1,否则为0 CASE WHEN Person = LAG(Person) OVER ( PARTITION BY TaskName, StepId ORDER BY operate_id ) THEN 0 ELSE 1 END AS change_flag FROM task_history ) t
逻辑说明
- 内层查询首先按
TaskName、StepId分组,组内按操作顺序排序,用LAG()窗口函数取同组上一条记录的处理人,和当前处理人对比生成变更标记 - 外层查询对变更标记做组内累加,每次遇到标记为1(处理人变更)时序号自动+1,即使同一处理人后续再次接手,也会生成新的序号,完全匹配需求。
效果示例
假设某任务某步骤的处理人操作顺序为:张三→张三→李四→张三→王五,生成的change_id结果为:1→1→2→3→4。
内容的提问来源于stack exchange,提问作者Lana B
相关产品推荐
相关产品推荐

