Snowflake中无ROWID时如何删除重复数据?
Snowflake中无ROWID时删除重复行的方法
在Snowflake中可以通过窗口函数、QUALIFY子句或重建表的方式处理重复行,以下是几种实用方案:
方案1:窗口函数+DELETE语句
通过ROW_NUMBER()给每组重复行标记序号,保留序号为1的行,删除其余重复项:
DELETE FROM your_table USING ( SELECT col1, col2, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1) AS rn FROM your_table ) AS dup_rows WHERE your_table.col1 = dup_rows.col1 AND your_table.col2 = dup_rows.col2 AND dup_rows.rn > 1;
PARTITION BY后填写判断重复的列组合,比如col1, col2表示这两列值完全相同即为重复。ORDER BY可指定保留哪一行,比如按更新时间update_time DESC保留最新行,无特殊需求可填任意重复列。
方案2:用QUALIFY简化删除逻辑
Snowflake支持QUALIFY子句直接过滤窗口函数结果,写法更简洁:
WITH duplicate_rows AS ( SELECT * FROM your_table QUALIFY ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1) > 1 ) DELETE FROM your_table USING duplicate_rows WHERE your_table.col1 = duplicate_rows.col1 AND your_table.col2 = duplicate_rows.col2;
方案3:重建去重表(适合批量去重)
如果表数据量较大,或希望一次性完成去重并备份原表,可直接创建去重后的新表替换原表:
-- 创建去重表(保留每组重复行的第一行) CREATE OR REPLACE TABLE your_table_deduped AS SELECT * FROM your_table QUALIFY ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1) = 1; -- 备份原表并替换 ALTER TABLE your_table RENAME TO your_table_backup; ALTER TABLE your_table_deduped RENAME TO your_table;
若只需简单去重(不关心保留哪一行),也可用SELECT DISTINCT *替代窗口函数。
注意事项
- 确保
PARTITION BY的列组合能准确识别重复行,避免误删或漏删。 - 若表有主键/唯一约束,需先检查约束是否合理,避免后续再产生重复行。
内容的提问来源于stack exchange,提问作者Etienne
相关产品推荐
相关产品推荐

