如何在RedShift中基于两唯一列删除重复记录,保留各guest_id分区最大rownum行
RedShift按guest_id分区保留最大rownum记录的实现方案
你可以根据数据量大小选择以下两种方案,注意把SQL中的guest_records替换为你的实际表名:
方案1:直接DELETE删除(适合小数据量场景)
直接关联分组查询结果,删除每个guest_id下非最大rownum的记录:
DELETE FROM guest_records WHERE (guest_id, rownum) NOT IN ( SELECT guest_id, MAX(rownum) AS max_rownum FROM guest_records GROUP BY guest_id );
方案2:CTAS重建表(适合大数据量场景,RedShift优先推荐)
RedShift是列存储数据库,大量DELETE操作会产生待清理的删除标记,数据量较大时建议用重建表的方式实现,性能更高:
-- 第一步:创建临时表存储需要保留的记录 CREATE TEMP TABLE temp_guest_clean AS SELECT guest_id, name, rownum FROM ( SELECT guest_id, name, rownum, -- 按guest_id分区,rownum倒序排序,取第一条就是最大rownum的记录 ROW_NUMBER() OVER(PARTITION BY guest_id ORDER BY rownum DESC) AS rn FROM guest_records ) t WHERE rn = 1; -- 第二步:清空原表 TRUNCATE TABLE guest_records; -- 第三步:将干净数据插回原表 INSERT INTO guest_records SELECT guest_id, name, rownum FROM temp_guest_clean;
注意事项
- 操作前务必先执行SELECT语句验证过滤逻辑,确认要保留的记录正确,最好提前备份数据避免误操作
- 用CTAS方案时,如果原表有自定义权限、依赖视图,操作完成后需要重新配置对应权限、重建依赖视图
内容的提问来源于stack exchange,提问作者safvan
相关产品推荐
相关产品推荐

