You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于状态列优先级在PROC SQL中实现ID去重

在PROC SQL中实现按状态优先级去重的方案

嗨,这个需求很好解决,核心思路是给不同的Status设置优先级(Done > In Progress > Backlog),然后通过分组筛选每个ID下优先级最高的记录就行。下面是具体的实现方法:

实现逻辑

  1. 给每个状态分配优先级权重:Done权重最高(比如3),In Progress次之(2),Backlog最低(1);
  2. 用窗口函数ROW_NUMBER()按ID分组,再按权重降序排序,给每个组内的记录编号;
  3. 筛选出每个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唯一的、符合优先级要求的状态记录。

验证结果

按照你的原始数据,运行后会得到如下结果:

IDStatus
1In Progress
2In Progress
3Done
4Backlog
5In Progress
6Done
7Done

完全符合你要求的保留规则~

内容的提问来源于stack exchange,提问作者mr Pi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:33:14