将DB记录匹配在一定的误差范围内

时间:2014-09-15 17:46:27

标签: database oracle

我有一个参考表(REF)和一个不完整数据表(ICD)。两种记录结构都是一样的。在这种情况下,它恰好包含人员相关数据。我试图用REF中最匹配行的数据填写ICD中的记录,如果最合适的行存在于合理范围内。 ICD表可能包含或缺少名字,中间名,姓氏,地址,城市,州,邮政编码,dob等。

我需要确保我填写的数据是100%准确的,所以我已经知道我将无法填写没有合理匹配的ICD行。

到目前为止,我已经编写了近十二种匹配查询的变体,在当前不匹配的行上运行,并在匹配的情况下引入数据。我知道必须有更好的方法。

我想要做的是在某些标准上设置权重,然后对所有满意的标准采用总和权重,如果超过某个阈值,则遵守该匹配。例如:

  • 名字匹配= 15分
  • 名字soundex匹配= 7分
  • 姓氏匹配= 25分
  • 姓氏soundex匹配= 10分
  • 中间名称匹配= 5分
  • 地址匹配= 25分
  • dob match = 15分

然后我搜索以前不匹配的行,任何超过72点的匹配都被宣布为自信匹配。

我似乎无法在单个查询中了解如何执行此操作。我在每个表格中也有一个唯一的ID(它们不会对齐或重叠,但它可能对跟踪子查询结果很有用)。

感谢!!!

2 个答案:

答案 0 :(得分:0)

以下是一些基本想法:

如果没有保证匹配的列,则必须考虑ICD中每行的REF中的每一行。基本上这只是两个表的连接而没有任何连接条件。

此连接为您提供行对,即每个表中列数的两倍。现在,您必须应用排名系统并计算其他列weight。您可以使用存储过程或许多解码来执行此操作,例如

decode(REF.firstName, ICD.firstName, 15, 0) + decode ...

现在您选择权重大于72的那些。问题是一个ICD行可能有多个自信匹配。如果您只想要最佳匹配,那么您最好按重量降序排序并执行更新。如果ICD行有多个自信的REF行,您将进行一些过时的更新,但更好的更新将始终排在最后并覆盖以前的更新。

如果您想在一次更新中完成所有操作,那将是另一项挑战。

答案 1 :(得分:0)

@tbone的评论是最正确的,但我不能将其标记为答案,因为它只是一个评论。

我确实创建了一个处理这个的包,它包含两个函数。

第一个函数查询引用表中与任何各种索引匹配的任何记录。然后计算与每个字段相关的分数。例如,姓氏完全匹配值为25,姓氏soundex匹配值为16,null值为0,总不匹配值为-15。将它们相加在一起,然后我运行各种查询来判断在放入垃圾之前阈值有多低。第一个函数以refc顺序从ref返回每一行,并返回与之关联的分数。

第二个函数使用超前和滞后来专门考虑第一个函数返回的最高分数,然后我添加了第二个检查,最高得分至少是从第二高分中领先的合理分数。这个技巧消除了我的错误比赛。如果匹配,则第二个函数返回匹配的唯一唯一ID。

从那里可以很容易地在ICD表上写一个更新语句。