如何基于hash_key和load_date组合删除重复行并保留STATUS值高的行?
删除重复行(按hash_key+load_date分组,保留STATUS降序首行)
核心思路是给每个hash_key与load_date的组合行按STATUS降序编号,保留编号为1的行,删除其余行。以下是具体实现方式:
通用SQL方案(支持PostgreSQL、SQL Server等)
使用CTE生成带序号的数据集,直接删除序号大于1的行:
WITH ranked_rows AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY hash_key, load_date ORDER BY STATUS DESC ) AS row_num FROM my_table ) DELETE FROM ranked_rows WHERE row_num > 1;
MySQL兼容方案
MySQL不支持直接删除CTE中的数据,可通过关联子查询实现:
DELETE t1 FROM my_table t1 INNER JOIN ( SELECT id, -- 假设表有主键id,用主键关联更精准 ROW_NUMBER() OVER ( PARTITION BY hash_key, load_date ORDER BY STATUS DESC ) AS row_num FROM my_table ) t2 ON t1.id = t2.id WHERE t2.row_num > 1;
注意事项
- 如果表没有主键,可使用多个字段组合关联(比如
hash_key、load_date、STATUS加上其他唯一标识字段),避免误删数据。 - 执行删除前建议先执行
SELECT语句验证要删除的行是否正确:将DELETE替换为SELECT *,确认后再执行删除操作。
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

