如何基于状态列优先级在PROC SQL中实现ID去重
在PROC SQL中实现按状态优先级去重的方案
嗨,这个需求很好解决,核心思路是给不同的Status设置优先级(Done > In Progress > Backlog),然后通过分组筛选每个ID下优先级最高的记录就行。下面是具体的实现方法:
实现逻辑
- 给每个状态分配优先级权重:
Done权重最高(比如3),In Progress次之(2),Backlog最低(1); - 用窗口函数
ROW_NUMBER()按ID分组,再按权重降序排序,给每个组内的记录编号; - 筛选出每个ID编号为1的记录,就是我们需要的最终结果。
完整PROC SQL代码
PROC SQL; /* 创建去重后的最终表 */ CREATE TABLE final_unique_data AS SELECT ID, Status FROM ( /* 内层子查询:给每个记录添加优先级排序编号 */ SELECT ID, Status, ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY CASE Status WHEN 'Done' THEN 3 WHEN 'In Progress' THEN 2 WHEN 'Backlog' THEN 1 END DESC ) AS priority_rank FROM your_source_table /* 替换成你的原始表名 */ ) ranked_data WHERE priority_rank = 1; /* 只保留每个ID下优先级最高的记录 */ QUIT;
代码解释
PARTITION BY ID:把数据按ID分成独立的组,每个组内处理自己的记录;ORDER BY CASE ... DESC:根据状态的优先级从高到低排序,确保Done排在最前面,其次是In Progress,最后是Backlog;ROW_NUMBER():给每个组内的记录按排序结果编号,优先级最高的记录编号为1;- 外层查询筛选
priority_rank = 1,就得到了每个ID唯一的、符合优先级要求的状态记录。
验证结果
按照你的原始数据,运行后会得到如下结果:
| ID | Status |
|---|---|
| 1 | In Progress |
| 2 | In Progress |
| 3 | Done |
| 4 | Backlog |
| 5 | In Progress |
| 6 | Done |
| 7 | Done |
完全符合你要求的保留规则~
内容的提问来源于stack exchange,提问作者mr Pi
相关产品推荐
相关产品推荐

