我有两个表,包含以下字段:
我试图找到两个表之间的匹配记录和最有可能匹配的记录,但由于输入错误、数据丢失、名称拼写的变化等原因,这些记录不完全匹配。
一些数据丢失了。但是对于所有存在的数据,两个表对于每个数据元素都具有相同的格式/数据类型。
理想情况下,我希望为结果建立某种加权机制。
如果SSN是一个直接匹配,那么我们就有一个匹配。但我也想考虑一下,如果有一个用户输入错误和2位数字混淆或类似的情况。
我在皮卡上有什么选择?
如果我运行多个变体(示例),直线匹配就可以了。
然而,我希望部署一个更完整的解决方案,并正在寻找关于如何继续进行的任何技巧。
发布于 2015-11-10 18:50:26
这叫做概率记录链接 (实际上它有几个名字)。
您要做的第一件事是标准化每一列的值,以便它们是直接可比较的。例如,日期应采用ISO格式并进行裁剪。
简单的方法
计算匹配列的数量:
select
n.id as needle_id,
h.id as haystack_id,
case when n.col1 = h.col1 then 1 else 0 end
+ case when some_comparison_function(n.col2, h.col2) then 1 else 0 end
+ ...
as relevance
from
needles n
join
haystack h -- haystack table could be the same as needles table
on -- only compare rows where at least one column matches
n.col1 = h.col1
or some_comparison_function(n.col2, h.col2)
or ...
order by
relevance desc;更难但更正确的方法
这在数学上是证明最优的。它根据稀有值计算列的权重。
m-prob (称它为99%)。u-probm-prob / u-prob,则计算优势比;如果他们不同意,则计算优势比:(1 - m-prob) / (1 - u-prob)。total_odds / (1 + total_odds)发布于 2015-11-10 18:42:45
我认为fuzzystrmatch和/或pg_trgm模块是您要寻找的。
https://stackoverflow.com/questions/33636497
复制相似问题