【问题标题】:How to Delete Duplicate Rows Based on 3 Column Values and Length in MySQL如何在 MySQL 中根据 3 列值和长度删除重复行
【发布时间】:2020-02-25 17:47:42
【问题描述】:

我需要一些帮助来了解如何从我的数据库表中删除重复记录。我有一个包含 100 万条记录的表,已在 2 年内收集,因此有许多记录需要删除,因为它们已被多次添加到数据库中。

以下是我根据我为重复匹配的三列编写的查询,进行计数,我还添加了其中一列的长度,因为这将确定我是删除所有记录还是只删除重复。

SELECT
    Ref_No, 
    End_Date, 
    Filename,
    count(*) as cnt,
    length(Ref_No)
FROM
    master_table
GROUP BY
    Ref_No, 
    End_Date, 
    Filename,
    length(Ref_No)
HAVING
    COUNT(*) > 1
    ;

这会给我一个如下输出:

Ref_No | End_Date | Filename | cnt | length(Ref_No)
05011384 | 2018-07-01 | File1 | 2 | 8
1234 | 2018-12-31 File2 | 11 | 4
1000002975625 | 2018-12-31 | File3 | 13
123456789123456789 | 2019-02-06 | File3 | 18

现在我有一个基于长度列要遵循的规则列表,这将确定我是否将记录与重复项保持原样,删除重复项或删除所有记录,这就是我卡住的地方。

我的规则如下:

如果长度在 0 到 4 之间 - 保留所有重复记录

如果长度在 5 到 10 之间 - 删除重复项,保留 1 条记录

如果长度等于 13 - 删除重复项,保留 1 条记录

如果长度为 11、12、14-30 - 删除所有记录

如果有人能就我如何完成这项任务提供建议,我将不胜感激。

谢谢。

【问题讨论】:

  • 表中是否有主键,可以区分“重复”行吗?
  • SELECT ROW_NUMBER, * FROM master_Table WHERE((length(Ref_No) between 5 and 10 or length(Ref_no)=13) and row_number>1) or (length(Ref_no) in (11,12) or length(Ref_no)>=14 这将选择您认为可以删除的所有记录,要在 MySQL 中获取 ROW_NUMBER,请参阅:stackoverflow.com/questions/1895110/row-number-in-mysql
  • 嗨,Paul,有一个主键,它是一个 ID 列。我也有索引的结束日期列。
  • 嗨 Luuk,尝试了查询,但我猜我有 5.7 版,ROW_NUMBER 不起作用。将通过您提到的链接。

标签: mysql


【解决方案1】:

我设法创建了一个临时表,在其中添加了一个唯一 ID。唯一的问题是我运行了两次查询,长度部分根据我的要求进行了更改。

INSERT INTO UniqueIDs
    (
    SELECT
        T1.ID
    FROM
        master_table T1
    LEFT JOIN
        master_table T2
    ON
    (
        T1.Ref_No = T2.Ref_No
    AND
        T1.End_Date = T2.End_Date
    AND
        T1.Filename = T2.Filename
    AND
        T1.ID > T2.ID
    )
    WHERE T2.ID IS NULL
    AND
        LENGTH(T1.Ref_No) BETWEEN 5 AND 10
    )
    ;

然后我只需运行以下删除以将唯一 ID 保留在表中并删除其余部分。

DELETE FROM master_table WHERE id NOT IN (SELECT ID FROM UniqueIDs);

就是这样。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多