如何在SQL Server中移除数据集的重复审批中间节点行
在SQL Server中移除审批流程中间行的实现方案
需求说明
现有审批数据集:
| emp_code | Apr_Level_Id | ReviewBy | ReviewByEmp_Code | w_Stage |
|---|---|---|---|---|
| 111 | 1 | 1 | 111 | 0 |
| 111 | 23 | 2 | 143 | 1 |
| 111 | 24 | 2 | 144 | 2 |
| 111 | 25 | 2 | 143 | 3 |
| 111 | NULL | 3 | 70 | 0 |
审批流程按ReviewBy和w_Stage升序推进,当同一emp_code+ReviewBy层级下,同一个ReviewByEmp_Code多次出现时,需要保留**最后一次出现(最大w_Stage)**的记录,并移除中间的所有相关行,最终得到:
| emp_code | Apr_Level_Id | ReviewBy | ReviewByEmp_Code | w_Stage |
|---|---|---|---|---|
| 111 | 1 | 1 | 111 | 0 |
| 111 | 25 | 2 | 143 | 3 |
| 111 | NULL | 3 | 70 | 0 |
实现SQL语句
以下是基于CTE和聚合逻辑的解决方案:
WITH cte_max_stage AS ( -- 标记每个员工、审批层级下,每个审批人的最后审批阶段 SELECT emp_code, ReviewBy, ReviewByEmp_Code, MAX(w_Stage) AS max_w_stage FROM your_table GROUP BY emp_code, ReviewBy, ReviewByEmp_Code ), cte_dup_ranges AS ( -- 定位存在重复审批人的层级中,重复阶段的起止范围 SELECT emp_code, ReviewBy, MIN(w_Stage) AS min_dup_stage, MAX(w_Stage) AS max_dup_stage FROM your_table t -- 筛选出存在更早记录的审批人(即重复出现的审批人) WHERE EXISTS ( SELECT 1 FROM cte_max_stage ms WHERE ms.emp_code = t.emp_code AND ms.ReviewBy = t.ReviewBy AND ms.ReviewByEmp_Code = t.ReviewByEmp_Code AND ms.max_w_stage > t.w_Stage ) GROUP BY emp_code, ReviewBy ) SELECT t.* FROM your_table t LEFT JOIN cte_dup_ranges r ON t.emp_code = r.emp_code AND t.ReviewBy = r.ReviewBy AND t.w_Stage BETWEEN r.min_dup_stage AND r.max_dup_stage WHERE -- 保留条件:不在重复阶段区间内,或是该审批人的最后一次记录 r.emp_code IS NULL OR EXISTS ( SELECT 1 FROM cte_max_stage ms WHERE ms.emp_code = t.emp_code AND ms.ReviewBy = t.ReviewBy AND ms.ReviewByEmp_Code = t.ReviewByEmp_Code AND ms.max_w_stage = t.w_Stage );
逻辑解释
cte_max_stage:通过分组聚合,确定每个审批人在对应层级下的最后审批阶段,用于后续识别需要保留的最终记录。cte_dup_ranges:找出存在重复审批人的层级中,重复阶段的起止区间(从第一次出现重复审批人的阶段到最后一次出现的阶段),明确需要移除的中间行范围。- 最终查询:通过左连接判断当前行是否在重复区间内,不在区间内的行直接保留;在区间内的行仅保留属于审批人最后一次记录的行,从而移除所有中间冗余行。
注意事项
- 将
your_table替换为实际的表名。 - 若存在多个
emp_code或ReviewBy层级,该语句会自动批量处理所有符合条件的记录。 - 对于
NULL值(如示例中的Apr_Level_Id),SQL Server会正常处理,不影响逻辑执行。
内容的提问来源于stack exchange,提问作者amol rogye
相关产品推荐
相关产品推荐

