You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:39:03