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

如何在Redshift SQL/PostgreSQL中按多条件去除重复数据

解决方案:Redshift/PostgreSQL实现按规则去重

完全可以实现,用窗口函数ROW_NUMBER()是最直接的方案,完美匹配你的需求,不需要纠结GROUP BY的问题。

核心思路

  • 给Status按优先级赋值(AAA=4,BBB=3,CCC=2,DDD=1,EEE=0),用于排序判断优先级
  • 按ID1分组,对每组内的记录先按Status优先级降序(优先选高优先级),再按Date+Time降序(同优先级选最新时间)排序
  • 取每组排序后行号为1的记录,就是最终需要的去重结果

完整SQL代码

WITH ranked_records AS (
    SELECT 
        ID1,
        ID2,
        Date,
        Time,
        Status,
        Price,
        -- 给Status分配优先级分数
        CASE 
            WHEN Status = 'AAA' THEN 4
            WHEN Status = 'BBB' THEN 3
            WHEN Status = 'CCC' THEN 2
            WHEN Status = 'DDD' THEN 1
            WHEN Status = 'EEE' THEN 0
            ELSE NULL 
        END AS status_priority,
        -- 按规则生成行号,每组内优先级高、时间新的排前面
        ROW_NUMBER() OVER (
            PARTITION BY ID1 
            ORDER BY status_priority DESC, Date DESC, Time DESC
        ) AS row_num
    FROM table1 a 
    LEFT JOIN table2 b ON a.id1 = b.id1 -- 保留你原有的表关联逻辑
)
SELECT 
    ID1,
    ID2,
    Date,
    Time,
    Status,
    Price
FROM ranked_records
WHERE row_num = 1;

关键说明

  • ROW_NUMBER()会给每个ID1组内的记录按规则分配唯一行号,行号为1的就是每组符合要求的唯一记录
  • 这个写法在Redshift和PostgreSQL中完全兼容,无需调整语法
  • 如果你的数据来自单表,直接把CTE里的关联语句替换成单表名即可

你之前SQL失败的原因

GROUP BY要求所有非聚合列必须加入分组条件,这就导致无法只按ID1分组筛选单条目标记录。而窗口函数是在分组内给每条记录做标记,再通过筛选标记获取结果,完美避开了GROUP BY的限制。

内容的提问来源于stack exchange,提问作者amestrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:40:40