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

如何在RedShift中基于两唯一列删除重复记录,保留各guest_id分区最大rownum行

RedShift按guest_id分区保留最大rownum记录的实现方案

你可以根据数据量大小选择以下两种方案,注意把SQL中的guest_records替换为你的实际表名:

方案1:直接DELETE删除(适合小数据量场景)

直接关联分组查询结果,删除每个guest_id下非最大rownum的记录:

DELETE FROM guest_records
WHERE (guest_id, rownum) NOT IN (
    SELECT guest_id, MAX(rownum) AS max_rownum
    FROM guest_records
    GROUP BY guest_id
);

方案2:CTAS重建表(适合大数据量场景,RedShift优先推荐)

RedShift是列存储数据库,大量DELETE操作会产生待清理的删除标记,数据量较大时建议用重建表的方式实现,性能更高:

-- 第一步:创建临时表存储需要保留的记录
CREATE TEMP TABLE temp_guest_clean AS
SELECT guest_id, name, rownum
FROM (
    SELECT 
        guest_id,
        name,
        rownum,
        -- 按guest_id分区,rownum倒序排序,取第一条就是最大rownum的记录
        ROW_NUMBER() OVER(PARTITION BY guest_id ORDER BY rownum DESC) AS rn
    FROM guest_records
) t
WHERE rn = 1;

-- 第二步:清空原表
TRUNCATE TABLE guest_records;

-- 第三步:将干净数据插回原表
INSERT INTO guest_records
SELECT guest_id, name, rownum FROM temp_guest_clean;

注意事项

  • 操作前务必先执行SELECT语句验证过滤逻辑,确认要保留的记录正确,最好提前备份数据避免误操作
  • 用CTAS方案时,如果原表有自定义权限、依赖视图,操作完成后需要重新配置对应权限、重建依赖视图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:36:02