【问题标题】:Finding duplicate records using cascading criteria, then combining into one record使用级联条件查找重复记录,然后合并为一条记录
【发布时间】:2017-07-08 17:32:50
【问题描述】:

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

我们正在一个项目中,我们正在合并来自多个旧系统的客户列表。我在暂存数据库中有一个原始客户表,其中包含来自这些多个来源的记录。在将最终表写入数据集市之前,我们需要执行以下操作。我认为这在数据清理/金唱片世界中会很常见,但经过大量搜索,无法找到类似的帖子。

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

  1. 一旦识别出重复的记录,我们希望将代表客户的那些记录组合起来,以便我们最终将代表客户的 1 条记录写入新表,使用相同的字段。组合是通过比较类似字段的值来完成的。如果 SSN 从一个源中丢失,但在另一个源中可用,则使用该 SSN。如果有超过 2 条代表客户的记录,并且超过 1 条有 SSN,并且这些 SSN 编号不同,则根据记录来自哪个系统存在层次结构,我们希望将 SSN 值写入等级最高的系统。这种逻辑将应用于我们需要检查的每个领域。

我认为对我来说最难概念化的部分是如何存储一条记录的值,以便您可以与同一张表中的一条或多条其他记录进行比较,执行实际的比较逻辑,然后编写“获胜" 对新表的价值?如果我能得到一些帮助,将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    此查询满足您对大纲的基本要求

    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
    

    在每次匹配迭代后保存结果。

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

    您最终会得到一组基于不同强度匹配标准的结果。

    最后,“可疑匹配”的数量(您不确定两个客户是否相同)将取决于数据的初始质量和“准备”后的质量。您可能仍需要手动分析一些数据。

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多