我正在尝试编写一个查询,它将返回关于“name”列的类似行。我的问题是,在我的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 ;
但是,这会导致大量名称完全不相似的结果。有没有办法我可以缩小我的结果,只包括类似的(但不是完全重复!)名字?这似乎是不可能的,因为我不知道确切哪些行有相似的名称,但我想我会问一些Maven。
要清楚的是,这不是一个重复的其他问题张贴,因为我不知道两个(或更多)字符串的内容,而海报似乎知道一些内容。理想情况下,我希望查询将结果限制为“name”列中前3或4个字符相同的行。不过,我也不知道有关字符串的内容。希望这有助于澄清我的问题。
我打算对这些结果做的是手动审核每个重复行中的其余信息(每行超过90个其他列中可能有或可能没有必须准确的抽象信息),然后删除不需要的行。我只想得到最简洁和准确的列表,我可以通过,所以我不必滚动超过10000行寻找类似的名字。
为了记录在案,我确实知道一个事实,那就是这两行在中间的首字母之前都会有完全相似的名字。在过去,有人使用一个工具将名称从一个数据库导出到我的sql数据库,其中包括中间的缩写。从那以后,我导入了另一个不包含中间缩写的列表。我要找的是那个子集中有中间首字母的。
1条答案
按热度按时间vxqlmq5t1#
这是一个非常大的主题,工作取决于您认为“相似”的内容以及数据的结构。例如,你想和doe,johnathan匹配吗?
有几种算法,但如果您有一个大的数据集,单独匹配名称时,它们可能会占用大量资源。这就是为什么经常使用诸如dob、email或address等其他属性来首先缩小可能的匹配范围,然后比较名称通常效果更好。
在比较时,可以使用几种算法,如jaro-winkler、levenshtein距离、ngrams。但你也应该考虑“信心”的匹配看其他信息,如上述建议。
匹配地址的问题是你有同样的模糊逻辑问题。第一对第一。所以如果走这条路,我会用另一个服务把gps坐标转换成x距离内的记录。
而这个古老的问题是夫妻的匹配。我个人认识一对已婚夫妇,都叫迈克尔·哈特菲尔德。所以你可以试着输入姓名的性别,但是特里、特蕾西等可以是。。。。
底线是只有在必须的情况下,并且如果您确实研究了其他解决方案(如melissa data提供的服务、sql server data quality services作为工具)时,才能选择名称相似的路线。。。。。
更新每个评论关于中间首字母。如果您总是知道名称将是相同的,除了中间的首字母,那么这个任务可以相当简单,不需要任何复杂的算法。您可以基于一个字符串+“%”与另一个字符串相似进行匹配,然后进行测试以确保长度只有2个不同,并且其中的空格比较小的字符串多1个。或者你可以尝试清理/删除中间的首字母,这可能有点复杂,如果名称中有一个空格doe,ann marie。但是你可以通过测试第二个到最后一个字符是否是空格来实现。