SQL-查找具有未知但略微相似的值的行吗?

时间:2018-08-08 19:03:14

标签: mysql sql

我正在尝试编写一个查询,该查询将返回有关“名称”列的类似行。 我的问题是在我的SQL数据库中,有以下示例:

NAME            DOB       
Doe, John       1990-01-01
Doe, John A     1990-01-01

我想要一个返回“名称”列相似但不完全相同的查询。由于我不确切知道发生这种情况的患者,因此我不能仅查询“ Doe,John%”。

我已经使用MySQL Workbench编写了此查询:

    SELECT
        Name, DOB, id, COUNT(*)
    FROM
        Table
    GROUP BY
        DOB
    HAVING 
        COUNT(*) > 1 ;

但是,这会导致不希望的结果数量,而Name根本不相似。有什么方法可以缩小搜索结果的范围,使其仅包含相似(但不完全重复!)的名称?这似乎是不可能的,因为我不知道确切地知道哪些行具有相似的名称,但是我想问一些专家。

要清楚,这不是发布的其他问题的重复,因为我不知道两个(或更多)字符串的内容,而那个发贴人似乎已经知道了一些内容。理想情况下,我希望查询结果限制为“名称”列中前3或4个字符相同的行。 但同样,我不知道所讨论字符串的内容。希望这有助于澄清我的问题。

我打算对这些结果进行的操作是手动审核每个重复行中的其余信息(每行中超过90个其他列中可能有也可能没有抽象信息,这些信息必须是准确的),然后删除不需要的行。 我只想获得我可以通过的最简洁,最准确的列表,所以我不必滚动查找超过10,000行来查找相似的名称。

出于记录,我确实知道,直到中间首字母之前,这两行的名称将完全相似。过去,有人使用一种工具将名称从一个数据库导出到我的SQL数据库,其中包括中间的首字母缩写。从那时起,我导入了另一个不包含中间名首字母的列表。我正在寻找那些来自该子集的中间缩写的东西。

1 个答案:

答案 0 :(得分:0)

这是一个非常大的主题,其工作量取决于您认为“相似”的内容以及数据的结构。例如,您是否也想匹配Doe和Johnathan?

存在几种算法,但是如果您有大量数据集,则仅在匹配名称时它们可能会占用大量资源。这就是为什么经常使用其他属性(例如DOB,Email或Address)来先缩小可能的匹配范围,然后比较名称的效果通常更好的原因。

比较时,可以使用几种算法,例如Jaro-Winkler,Levenshtein距离,ngrams。但是您还应该通过查看上面建议的其他信息来考虑比赛的“信心”。

具有匹配地址的问题是您有同样的模糊逻辑问题。第一与第一。因此,如果走这条路线,我实际上会使用其他服务转换为GPS坐标,然后接受X距离范围内的记录。

与此相关的古老问题是配偶。我个人认识一对已婚夫妇,均名为迈克尔·哈特菲尔德。因此,您可以尝试输入姓名的性别,但是Terry,Tracy等可以是。...

最重要的是,只有在需要且确实要研究其他解决方案(例如Melissa data的服务,sql server data quality services as a tool .....

)时,才可以使用名称相似的方法。 每个关于中间名首字母的评论

更新。如果您始终知道名称与中间名首字母相同,则此任务可以非常简单,并且不需要任何复杂的算法。您可以根据一个字符串+'%'与另一个字符串相似来进行匹配,然后进行测试以确保长度只有2个不同,并且其中的空格比较小的字符串多1个。或者,您也可以尝试清理/移除中间的首字母,如果名字中有空格,Doe,Ann Marie,这可能会有些复杂。但是您可以通过测试倒数第二个字符是否为空格来做到这一点。