← 中文资源

简体中文版本

用窗口函数去重

用 row_number 按自然键保留最新一行并删除其余重复行,同时保持引用一致性。

阅读英文原文

目标

导入任务重复了一天的事件,留下重复业务行并破坏下游计数。本配方先用 row_number 按自然键分区并按更新时间与 id 降序排名,rN=1 即应保留的赢家,确认后再用单条 DELETE 删除其余行;删除前先在事务内把子表外键指向赢家,避免破坏引用。

步骤要点

  1. 先用 row_number 排名并检查保留哪一行。
  2. 用单条 DELETE 删除 rn 大于 1 的重复行。
  3. 排序加入 id 作为决胜项,保证结果稳定。
  4. 删除前在事务内把子表外键改指向赢家。
SELECT id, key_col, row_number() OVER (PARTITION BY key_col ORDER BY updated_at DESC, id DESC) AS rn
FROM events;

排错提示

  • 排序不确定会导致保留错误的赢家,需加决胜列。
  • 外键会阻止删除,需先改指向。
  • 删除不可逆,务必先备份。

适用边界

  • 大表需分批处理。
  • 依赖可靠的排序列。