我有两个表,已经填充了数据,如下所示:table1
数据是公民数据,具有以下字段:
uniqid (a uniqueIP for person, like social sec num)
first_name
last_name
birthdate
address
字符串table2
带字段:
first_name
last_name
birthdate
address
gender
healthinsurance_type
...
型table1
数据和table2
数据来自不同的独立机构。这些表中的名称可以以不同的方式键入,等等。table1
对名称和ID具有权威性。table2
是我需要处理的,但是没有ID(citizenID
)。
现在,我需要table2
中的每一行来获取一个citizenid
,它与table1
相关联,这样最后我就得到了带有附加ID列的table2
,它与每个人都正确关联。
比如在table1
中搜索某个条件匹配的人(table2
中的一行),如果table1
中存在一条记录,则将该记录的ID放入table2
中的一列。
但要快,而且要排好。
表1的行计数大约为200万。
表2的行数大约为900.000
1条答案
按热度按时间gmxoilav1#
我假设您是唯一一个向这些表写入数据的人,因此没有并发冲突。
第一步
将ID列添加到
table2
,现在可以为NULL:字符串
考虑在
table1
上添加一个标记,以便在另一边廉价地将row“撤出市场”:型
第二步
假设两边都没有复制品。否则你需要做更多。
第三步
使用完美、完全匹配更新表2中的所有行。也可以立即标记
table1
中的匹配行。使用数据修改CTE:型
只要一行有了
citizenid
,它就在两边都“退出市场”了。第四步
检查还剩多少行,并开始**逐步软化 predicate **,始终首先尝试更可能的匹配,以防止误报。在你开始这个循环过程之前,想一个系统的策略。分析剩余的行,找出系统性的错别字或类似的线索。
字符类型列的模糊匹配的可能选项包括:
型
相似性运算符
%
由附加模块pg_trgm提供,该模块还提供三元组索引以支持LIKE
和相似性匹配。您将 * 需要 * 索引**进行模糊匹配,否则您的查询可能需要 * 长 * 时间。考虑使用部分索引,以便在找到匹配项后立即从索引中删除行。喜欢的:
型
等等。
您可以使用以下命令微调
%
运算符的相似性阈值:型
第五步
有一小部分仍将悬而未决。您可以花费越来越多的时间来手动分配它们,直到您决定放弃其余的。
第六步
可选。当过程完成时,每行都有一个
citizenid
,现在可以设置为NOT NULL
,新行必须有一个citizenid
更多详情: