使用级联条件查找重复记录,然后合并为一条记录

时间:2017-07-08 17:32:50

标签: tsql sql-server-2012 data-cleansing record-linkage

我正在使用MS SQL Server 2012,并且已经完成了简单的查询和数据加载,但没有循环或case语句或嵌套选择。我正在寻找一些帮助,让我开始采用这种方法。

我们正处于一个项目中,我们正在整合来自多个遗留系统的客户列表。我在登台数据库中有一个原始客户表,其中包含来自这些多个来源的记录。在将最终表写入数据集市之前,我们需要执行以下操作。我认为在数据清理/黄金记录世界中这将是相当常见的情况,但经过大量搜索后,无法找到类似的帖子。

首先,我们需要查找代表同一客户的记录。这些记录来自多个来源,因此可能有超过2条记录代表同一客户。每个来源使用类似的模型。确定记录是否代表同一客户的标准根据可用值在级联层次结构中更改。我们想要用于记录的第一个标准是DOB和SSN。但是如果缺少SSN,则该行的标准将成为姓氏,名字和DOB。如果SSN和DOB都丢失,则重复测试将更改为姓氏+名字+另一个条件字段。如果缺少其中一个名称,即使在此之后还有其他标准。由于代表同一客户的记录可能有不同的字段,我们必须使用两个记录都可以使用的测试。如果事实证明给定客户只存在于一个系统中,则可能没有重复记录。

  1. 一旦识别出重复记录,我们希望将那些代表客户的记录组合在一起,这样我们就会得到1条记录,表示使用相同字段写入新表的客户。通过比较相似字段的值来完成组合。如果SSN在一个源中丢失,但在另一个源中可用,则使用该SSN。如果有超过2条代表客户的记录,并且超过1条记录具有SSN,并且这些SSN号码不同,则根据记录来自哪个系统存在层次结构,并且我们希望从中记录SSN值系统层次最高的系统。这种逻辑将应用于我们需要检查的每个领域。
  2. 我认为最难概念化的部分是如何存储一条记录的值,以便您可以与同一个表中的一个或多个其他记录进行比较,执行实际的比较逻辑,然后编写&# 34;中奖"值到新表?如果我能得到一些帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

此查询符合您概述的基本要求

SELECT a.ID,
    DENSE_RANK() OVER( PARTITION BY DOB, SSN ) AS Match1,
    DENSE_RANK() OVER( PARTITION BY [Last Name], [First Name], DOB ) AS Match2,
    DENSE_RANK() OVER( PARTITION BY [Last Name], [First Name], [Another criteria] ) AS Match3
INTO #Matchmaking
FROM tCustStaging

你可能会发现,你需要做准备" (首先清理)您的数据,确保它们都采用相同的格式并删除"垃圾"。常见问题可能是电话号码,其中可以使用各种格式,例如' 02 1234 1234',' 0212341234',' + 212341234'等名称也可能有拼写错误,尤其是复合名称。

进行匹配的另一种方法是单独计算所有字段的匹配

SELECT a.ID,
    DENSE_RANK() OVER( PARTITION BY SSN ) AS SSNMatch,
    DENSE_RANK() OVER( PARTITION BY DOB ) AS DOBMatch,
    DENSE_RANK() OVER( PARTITION BY LEFT( [Last Name], 10 ) ) AS LNMatch10,
    DENSE_RANK() OVER( PARTITION BY LEFT( [Last Name], 9 ) ) AS LNMatch9,
    DENSE_RANK() OVER( PARTITION BY LEFT( [Last Name], 9 ) ) AS LNMatch8,
    etc.
    DENSE_RANK() OVER( PARTITION BY LEFT( [Last Name], 3 ) ) AS LNMatch8,
    DENSE_RANK() OVER( PARTITION BY LEFT( [First Name], 10 ) ) AS FNMatch10,
    etc.
    DENSE_RANK() OVER( PARTITION BY [Other criteria1] ) AS OC1,
    DENSE_RANK() OVER( PARTITION BY [Other criteria2] ) AS OC2,
INTO #Matchmaking
FROM tCustStaging

然后创建最强匹配(SSN,DOB)。您还可以尝试使用各种字段组合来查看所获得的内容。

-- You can play around with various combinations to see what results you get
SELECT c.*
FROM #Matchmaking AS a
    INNER JOIN #Matchmaking AS b ON a.SSNMatch = b.SSNMatch AND a.DOBMatch = b.DOBMatch AND a.LNMatch10 = b.LNMatch10
    INNER JOIN tCustStaging AS C ON a.ID = c.ID

每次匹配迭代后,您都会保存结果。

然后您继续放宽匹配条件,同时仔细检查错误匹配,直到匹配条件太弱以至于您不再获得有用的结果。

最终会根据不同的匹配标准强度得出一组结果。

最终可疑的比赛次数" (您不确定两个客户是否相同)将取决于数据的初始质量及其准备后的质量"。您可能仍需要手动分析一些数据。