从小表中删除重复行

新手上路,请多包涵

我在 PostgreSQL 8.3.8 数据库中有一个表,它上面没有键/约束,并且有多行具有完全相同的值。

我想删除所有重复项并只保留每行的 1 个副本。

特别是有一列(名为“key”)可用于识别重复项,即每个不同的“key”应该只存在一个条目。

我怎样才能做到这一点? (理想情况下,使用单个 SQL 命令。)

在这种情况下,速度不是问题(只有几行)。

原文由 André Morujão 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 537
2 个回答
DELETE FROM dupes a
WHERE a.ctid <> (SELECT min(b.ctid)
                 FROM   dupes b
                 WHERE  a.key = b.key);

原文由 a_horse_with_no_name 发布,翻译遵循 CC BY-SA 3.0 许可协议

DELETE FROM tracking_order
WHERE
    mvd_id IN (---column you need to remove duplicate
        SELECT
            mvd_id
        FROM (
            SELECT
                mvd_id,thoi_gian_gui,
                ROW_NUMBER() OVER (
                    PARTITION BY mvd_id
                    ORDER BY thoi_gian_gui desc) AS row_num
            FROM
                tracking_order
        ) s_alias
        WHERE row_num > 1)
    AND thoi_gian_gui in ( --column you used to compare to delete duplicates, eg last update time
        SELECT
                thoi_gian_gui
        FROM (
            SELECT
                thoi_gian_gui,
                ROW_NUMBER() OVER (
                    PARTITION BY mvd_id
                    ORDER BY thoi_gian_gui desc) AS row_num
            FROM
                tracking_order
        ) s_alias
        WHERE row_num > 1)

我的代码,我删除了所有重复的 7800445 行,并在 7 分 28 秒内仅保留每行的 1 个副本。 在此处输入图像描述

原文由 Trung Truong 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进