如何在Redshift SQL/PostgreSQL中按多条件去除重复数据
解决方案:Redshift/PostgreSQL实现按规则去重
完全可以实现,用窗口函数ROW_NUMBER()是最直接的方案,完美匹配你的需求,不需要纠结GROUP BY的问题。
核心思路
- 给
Status按优先级赋值(AAA=4,BBB=3,CCC=2,DDD=1,EEE=0),用于排序判断优先级 - 按
ID1分组,对每组内的记录先按Status优先级降序(优先选高优先级),再按Date+Time降序(同优先级选最新时间)排序 - 取每组排序后行号为1的记录,就是最终需要的去重结果
完整SQL代码
WITH ranked_records AS ( SELECT ID1, ID2, Date, Time, Status, Price, -- 给Status分配优先级分数 CASE WHEN Status = 'AAA' THEN 4 WHEN Status = 'BBB' THEN 3 WHEN Status = 'CCC' THEN 2 WHEN Status = 'DDD' THEN 1 WHEN Status = 'EEE' THEN 0 ELSE NULL END AS status_priority, -- 按规则生成行号,每组内优先级高、时间新的排前面 ROW_NUMBER() OVER ( PARTITION BY ID1 ORDER BY status_priority DESC, Date DESC, Time DESC ) AS row_num FROM table1 a LEFT JOIN table2 b ON a.id1 = b.id1 -- 保留你原有的表关联逻辑 ) SELECT ID1, ID2, Date, Time, Status, Price FROM ranked_records WHERE row_num = 1;
关键说明
ROW_NUMBER()会给每个ID1组内的记录按规则分配唯一行号,行号为1的就是每组符合要求的唯一记录- 这个写法在Redshift和PostgreSQL中完全兼容,无需调整语法
- 如果你的数据来自单表,直接把CTE里的关联语句替换成单表名即可
你之前SQL失败的原因
GROUP BY要求所有非聚合列必须加入分组条件,这就导致无法只按ID1分组筛选单条目标记录。而窗口函数是在分组内给每条记录做标记,再通过筛选标记获取结果,完美避开了GROUP BY的限制。
内容的提问来源于stack exchange,提问作者amestrian
相关产品推荐
相关产品推荐

