在Snowflake中使用ROW_NUMBER对全列重复数据去重的排序字段咨询
百万级数据去重:ROW_NUMBER窗口函数的ORDER BY指定建议
- 用常量直接排序
因为同一分区内所有行的字段值完全一致,排序逻辑不会影响最终保留的行,所以可以直接用常量作为排序依据,比如ORDER BY 1或者ORDER BY 'dummy'。这种写法不需要数据库做实际的排序运算,性能开销极低,示例SQL:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY project_id, calendar_date ORDER BY 1) AS rn FROM your_source_table ) deduplicated WHERE rn = 1;
- 选用任意现有字段排序
如果担心常量排序在某些数据库中存在兼容性问题,直接选表中已有的任意字段(比如project_id、calendar_date甚至其他字段)即可。同一分区内这些字段的值完全相同,排序不会产生实际的顺序差异,同样不会增加额外的性能负担,示例:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY project_id, calendar_date ORDER BY calendar_date) AS rn FROM your_source_table ) deduplicated WHERE rn = 1;
- 额外性能建议
不要盲目替换DISTINCT:很多主流数据库对DISTINCT的哈希去重优化已经非常成熟,百万级数据场景下可以先分别测试DISTINCT和ROW_NUMBER两种方案的实际执行耗时,再决定用哪种更合适。
内容的提问来源于stack exchange,提问作者Teja Goud Kandula
相关产品推荐
相关产品推荐

