我正在尝试编写一个查询,该查询将返回与"Name“列有关的类似行。我的问题是,在我的SQL数据库中,有以下示例:
NAME DOB
Doe, John 1990-01-01
Doe, John A 1990-01-01我想要一个查询,返回与"Name“列相似但不精确的重复项。因为我不知道具体发生在哪个病人身上,所以我不能只询问"Doe,John%“。
我使用MySQL工作台编写了这个查询:
SELECT
Name, DOB, id, COUNT(*)
FROM
Table
GROUP BY
DOB
HAVING
COUNT(*) > 1 ;但是,这会导致一些名称根本不相似的结果。有什么办法可以缩小我的结果,只包括相似(但不完全重复!)名字?这似乎是不可能的,因为我不知道哪些行有相似的名字,但我想问一些专家。
要明确的是,这不是发布的另一个问题的副本,因为我不知道这两个(或更多)字符串的内容,而那个海报似乎知道一些内容。理想情况下,我希望将查询限制结果限制为"Name“列中前3或4个字符相同的行。但是,我也不知道这些字符串的内容。希望这有助于澄清我的问题。
我打算对这些结果进行手动审计,对每个重复行中的其余信息进行审计(每行可能有90多个其他列,也可能没有必须准确的抽象信息),然后删除不需要的行。我只是想得到最简洁和准确的列表,我可以通过,所以我不必滚动超过10,000行寻找类似的名字。
为了记录在案,我确实知道,这两行的名称将完全相同,直到中间的首字母。过去,有人使用一个工具将名称从一个数据库导出到我的SQL数据库,其中包括中间首字母。从那以后,我又导入了另一个不包括中间首字母的列表。我正在寻找那些从那个子集中带有中间首字母的字母。
发布于 2018-08-08 20:12:24
这是一个非常大的主题,这取决于您认为什么是“相似的”以及数据的结构。例如,你也想要匹配Doe,Johnathan吗?
有几种算法,但是如果您有一个大的数据集,那么它们在仅匹配名称时就会非常耗费资源。这就是为什么经常使用其他属性,如道布,或电子邮件,或地址,首先缩小您可能的匹配,然后比较名称通常更好。
在比较时,您可以使用几种算法,例如Jaro、Levenshtein距离、ngram。但是,你也应该考虑到匹配的“信心”,看看上面建议的其他信息。
匹配地址的问题是,您有同样的模糊逻辑问题。第一对第一。因此,如果走这条路,我会使用另一种服务转换成GPS坐标,然后接受X距离内的记录。
这件事的老生常谈就是匹配一对夫妻。我个人认识一对夫妇,他们都叫迈克尔·哈特菲尔德。所以你可以尝试引入性别的名字,但特里,特蕾西,等等都可以.
底线是只有在必要的情况下才走名字相似的路线,如果你真的要研究其他解决方案,如Melissa data,sql server数据质量服务作为一个工具……
更新每评论关于中间的初始值。如果您总是知道名称将相同,除了中间的初始值,那么这个任务可以相当简单,不需要任何复杂的算法。您可以根据一个字符串+ '%‘和另一个字符串的情况进行匹配,然后进行测试,以确保长度只有两个不同,并且其中比较小的字符串多了一个空格。或者,您可以尝试清理/删除中间的首字母,如果名称中有一个空格,则这可能会有点复杂。但是你可以通过测试最后一个字符是否是一个空格来完成。
https://stackoverflow.com/questions/51753929
复制相似问题