目标
导入任务重复了一天的事件,留下重复业务行并破坏下游计数。本配方先用 row_number 按自然键分区并按更新时间与 id 降序排名,rN=1 即应保留的赢家,确认后再用单条 DELETE 删除其余行;删除前先在事务内把子表外键指向赢家,避免破坏引用。
步骤要点
- 先用 row_number 排名并检查保留哪一行。
- 用单条 DELETE 删除 rn 大于 1 的重复行。
- 排序加入 id 作为决胜项,保证结果稳定。
- 删除前在事务内把子表外键改指向赢家。
SELECT id, key_col, row_number() OVER (PARTITION BY key_col ORDER BY updated_at DESC, id DESC) AS rn
FROM events;
排错提示
- 排序不确定会导致保留错误的赢家,需加决胜列。
- 外键会阻止删除,需先改指向。
- 删除不可逆,务必先备份。
适用边界
- 大表需分批处理。
- 依赖可靠的排序列。