RedShift不支持DISTINCT ON时如何实现指定字段去重插入
RedShift替代DISTINCT ON的SQL写法
PostgreSQL中的DISTINCT ON语法用于按照指定字段分组,每组返回第一条匹配的记录,RedShift不支持该语法,可以通过ROW_NUMBER()窗口函数实现同等效果,调整方案如下:
- 以你需要去重的字段列表作为
PARTITION BY的分组依据 - 补充分组内的排序规则,明确每组优先取哪条记录(例如按
date_created倒序取最新记录) - 外层筛选行号为1的记录即可实现去重效果
调整后的完整SQL示例:
INSERT INTO table ( contributor_user_id, device_id_source, device_os, device_model, device_design, device_serial, device_carrier, device_os_version, device_manufacturer, device_current_app_build, device_current_app_version, date_created, date_updated, edw_date_created ) SELECT pin_connect_id, files_device_id_source, files_device_os, files_device_model, files_device_design, files_device_serial, files_device_carrier, files_device_os_version, files_device_manufacturer, files_device_current_app_build, files_device_current_app_version, date_created, date_updated, getdate() FROM ( SELECT pin_connect_id, files_device_id_source, files_device_os, files_device_model, files_device_design, files_device_serial, files_device_carrier, files_device_os_version, files_device_manufacturer, files_device_current_app_build, files_device_current_app_version, date_created, date_updated, ROW_NUMBER() OVER ( PARTITION BY pin_connect_id, files_device_id_source, files_device_os, files_device_model, files_device_design, files_device_serial, files_device_carrier, files_device_os_version, files_device_manufacturer, files_device_current_app_build, files_device_current_app_version -- 可根据业务需求调整排序规则,示例为按创建时间倒序取最新一条 ORDER BY date_created DESC ) AS rn FROM 你的源表名 -- 替换为实际的源表名称 ) t WHERE rn = 1;
注意:如果没有指定分组内的排序规则,返回的去重记录是不确定的,必须根据实际业务需求调整
ORDER BY部分的逻辑。
内容的提问来源于stack exchange,提问作者Viktor Andriichuk
相关产品推荐
相关产品推荐

