【问题标题】:SQL for Fuzzy Match Deduplication用于模糊匹配重复数据删除的 SQL
【发布时间】:2019-02-12 03:56:48
【问题描述】:

表 A 的记录具有重复的实体和细微的字符串变化。没有唯一的键可以唯一地标识一个实体。字段“ID”标识表内的记录,而不是实体本身。

    TABLE A
    --------------
    ID;SomeString
    1;something1
    2;something2
    3;something3

通过使用模糊匹配软件,将表A与自身进行模糊匹配,以检测重复记录。查找表 B 就是这样创建的,它有两列:ID1 和 ID2,表示表 A 中匹配记录的 ID。

    TABLE B
    ---------
    ID1;ID2
    1;2
    1;3
    2;1
    2;3
    3;1
    3;2

去重的结果是从表 A 中删除记录 2 和 3,从而只保留第一条记录。

    TABLE A
    --------------
    ID;SomeString
    1;something1

有没有办法通过SQL来执行表A的这种模糊匹配去重,通过使用表B作为识别重复记录的模糊匹配查找表? 澄清一下,我不是要求一种方法来进行模糊匹配或识别重复项,它已经完成并且结果在表 B 中。我问的是如何删除重复项(并为每个已识别的重复记录保留一条记录组),根据已识别的重复记录对(每个同一实体有多个重复记录对)。

【问题讨论】:

  • 您是在问是否有办法在 SQL 中实际进行模糊匹配(也许,但有更好的工具),或者是否有办法使用 结果 你的模糊匹配(在表 B 中)来处理删除(是的,很容易)?
  • 如果相似值遵循某种一致的模式,您可以使用带有一些通配符 (%) 值的 LIKE 运算符来查找相似值。表 B 的一个问题是您有镜像值,例如 1;2 和 2;1。如果您清理它以删除此类重复项,则可以根据表 B 中 ID2 的值删除表 A 中的行。
  • 您使用的是什么 DBMS?您需要定义究竟是什么构成了模糊匹配。它是否共享 90% 的字符、相等的连续字符超过 90% 的字符串长度、非数字字符匹配等等……我不是词源学家,但我敢打赌,所谓的“模糊”逻辑是故意暗示歧义。如果您打算在 SQL 中执行此操作,您的目标需要明确。
  • 我不是要求一种方法来进行模糊匹配,它已经完成并且结果在表 B 中。我要求一种方法来根据表 A 执行删除重复项确定的重复项(表 B 中的结果)。使用什么 DBMS 真的不相关,我的问题是关于 SQL 的一般性问题。
  • @zlatko 哪个 DBMS 可能是相关的,因为它们每个都实现了稍微不同的功能,所以可能有一个函数可以在一个 DBMS 中很好地处理它,而在另一个 DBMS 中没有实现。在这种情况下,我相信可以使用相当简单的CASE 语句来解决,但情况可能并非总是如此,即使它看起来像是一个一般的 SQL 问题。

标签: sql duplicates fuzzy-comparison


【解决方案1】:

我看到的主要问题是您的模糊匹配表包含重复的对,并且 ID 的顺序颠倒了。这意味着你有行说 2 是 1 的副本,1 是 2 的副本。如果你删除了基于表 B 的 ID2 列的所有行,你最终会删除表中的所有行答:

您可以使用重新排列列的 select 语句解决此问题,以便始终将较小的 ID 放在第一位。这样,前面的“2 是 1 的副本,1 是 2 的副本”的示例就变成了“2 是 1 的副本”的重复。此时,您可以选择不同的值以获取要从表 A 中删除的 ID 列表。

根据您的示例数据,此查询删除了正确的值:

WITH Duplicates (ID) AS
(
    SELECT DISTINCT 
        CASE
            WHEN ID1 > ID2 THEN ID1
            WHEN ID2 > ID1 THEN ID2
        END AS Duplicate
    FROM Table_B
)

DELETE
FROM Table_A
WHERE ID IN (SELECT * FROM Duplicates)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多