Snowflake表删除重复数据仅保留一条 除row_number跨表插入外的方法?
Snowflake 原表直接去重的两种常用方案
方案1:DELETE + 窗口函数定位重复行(灵活可控,推荐)
该方案支持自定义重复判断规则、保留行规则,适配绝大多数场景,无需创建额外中间表。
核心逻辑是先用ROW_NUMBER()给每个重复分组内的行标记编号,再直接删除编号大于1的重复行:
-- 先构造带行号的CTE,PARTITION BY后填写判断重复的字段,ORDER BY后填写保留行的排序规则(如下为按更新时间倒序,保留最新的行) WITH dup_mark AS ( SELECT SYSTEM$ROW_ID AS row_unique_id, -- Snowflake内置行唯一标识,无表主键时可直接使用 ROW_NUMBER() OVER(PARTITION BY 重复判断字段1, 重复判断字段2 ORDER BY 排序字段 DESC) AS rn FROM 你的表名 ) -- 删除重复行(rn>1的为需要删除的重复记录) DELETE FROM 你的表名 WHERE SYSTEM$ROW_ID IN (SELECT row_unique_id FROM dup_mark WHERE rn > 1);
操作提示:执行删除前可以先运行SELECT COUNT(*) FROM dup_mark WHERE rn>1确认待删除的行数是否符合预期,避免误删。
方案2:使用Snowflake原生REMOVE DUPLICATES语法(快捷高效)
Snowflake提供了专属的表去重语法,无需编写额外逻辑,一行命令即可完成去重,适合快速去重场景:
-- 场景1:基于指定字段判断重复,每个分组保留排序最高的1行 ALTER TABLE 你的表名 REMOVE DUPLICATES BY (重复判断字段1, 重复判断字段2) ORDER BY 排序字段 DESC; -- 场景2:仅清理完全一致的整行重复 ALTER TABLE 你的表名 REMOVE DUPLICATES;
注意事项
- 去重操作前建议先做原表快照备份,避免数据误删:
CREATE TABLE 你的表名_bak AS SELECT * FROM 你的表名; - 大表去重建议在业务低峰期执行,减少计算资源占用对线上业务的影响
- 若重复数据量超过原表数据量的50%,可以考虑用
CREATE OR REPLACE TABLE 你的表名 AS SELECT * FROM 你的表名 QUALIFY ROW_NUMBER() OVER(PARTITION BY 重复判断字段 ORDER BY 排序字段 DESC)=1的方式重建表,性能会优于逐行删除
内容的提问来源于stack exchange,提问作者ays1
相关产品推荐
相关产品推荐

