Sql Dynamics CRM 2015重复行清理

Sql Dynamics CRM 2015重复行清理,sql,sql-server,ssis,crm,dynamics-crm-2015,Sql,Sql Server,Ssis,Crm,Dynamics Crm 2015,我正在与Dynamics CRM 2015 online合作,并被赋予从活动帐户中删除重复项的任务 我目前正在使用Visual Studio 2012 SSIS和COZYROC SSIS+软件包 将所有活动帐户拉入表ActiveAccounts(所有15000个帐户)后,我创建了表NormalNameAccounts(首先为Null)和ActiveAccountsPassibleDuplicateReport(首先为Null)。首先,我生成一个单独的列,为每个帐户分配一个普通名称。普通名称的规则

我正在与Dynamics CRM 2015 online合作,并被赋予从活动帐户中删除重复项的任务

我目前正在使用Visual Studio 2012 SSIS和COZYROC SSIS+软件包

将所有活动帐户拉入表ActiveAccounts(所有15000个帐户)后,我创建了表NormalNameAccounts(首先为Null)和ActiveAccountsPassibleDuplicateReport(首先为Null)。首先,我生成一个单独的列,为每个帐户分配一个普通名称。普通名称的规则如下:

  • 没有空间

  • 没有字母数字字符

  • 将“&”标志替换为“和”

  • Corporation、Incorporated和Company缩写为(Corp,Inc,Co)

完成此操作后,我运行此语句以查找根据前10个字符计数大于1的所有事件

INSERT INTO NormalNameOccurrences 
select LEFT(NormalName, 10) AS NormalName,COUNT(*) AS Occurrences
FROM ActiveAccounts
GROUP BY LEFT(NormalName, 10) 
HAVING COUNT(*) > 1
ORDER BY NormalName
INSERT INTO ActiveAccountsPossibleDuplicateReport

SELECT
    DupeGroupID.*,
    DENSE_RANK() OVER (ORDER BY LEFT(DupeGroupID.NormalName,10)) as Match_ID

FROM
(
       SELECT *
       FROM  ActiveAccounts a
       WHERE EXISTS 
      (
        SELECT * 
        FROM NormalNameOccurences 
        Where LEFT(a.NormalName,10) = NormalName
       )
) DupeGroupID
然后,我运行以下查询,根据前10个字符对帐户进行分组

INSERT INTO NormalNameOccurrences 
select LEFT(NormalName, 10) AS NormalName,COUNT(*) AS Occurrences
FROM ActiveAccounts
GROUP BY LEFT(NormalName, 10) 
HAVING COUNT(*) > 1
ORDER BY NormalName
INSERT INTO ActiveAccountsPossibleDuplicateReport

SELECT
    DupeGroupID.*,
    DENSE_RANK() OVER (ORDER BY LEFT(DupeGroupID.NormalName,10)) as Match_ID

FROM
(
       SELECT *
       FROM  ActiveAccounts a
       WHERE EXISTS 
      (
        SELECT * 
        FROM NormalNameOccurences 
        Where LEFT(a.NormalName,10) = NormalName
       )
) DupeGroupID
这是一个例子,它提出了什么

Accountid   Name                           NormalName           Match_ID
1165894512  AT and T                       ATandT                   1
1236549458  AT&T                           ATandT                   1
9764312456  AT & T                         ATandT                   1
9856225415  Furniture                      FurnitureIndustry        2
6565652626  Furniture Inc.                 FurnitureIndustryInc     2
6427346857  Chemical Engineers of Idaho    ChemicalEngineersofIdaho 3
6457948461  Chemical Entourage, Inc.       ChemicalEntourageInc     3
5544997761  Chemical Entry, LLC            ChemicalEntryLLC         3
我的问题是,当我运行这个查询时,它会导致一些误报。帐户名可能以相同的10个字符开头,但下一个字符完全不匹配。 另一方面,如果我尝试将字符查找增加到12而不是10,我会丢失许多相同帐户的帐户,但是其中一个帐户名包含帐户类型,如上面的示例中的帐户9856225415和652626


任何关于如何解决这一问题的建议都将不胜感激

如果您需要一种自动识别重复项的方法,我鼓励您再次尝试SSIS模糊分组。这是一个很棒的步行体验:

通过反复试验,您可以找出什么样的相似性阈值为您提供了错误最少的数据集。“输出键”列将帮助您识别组。然后剩下的任务是将其聚合到单个记录中。i、 e.最终正常名称是什么以及所有其他属性。通常最好在几个不同的载体上进行重复数据消除,例如包括邮政编码和电子邮件


如果你想考虑手工方法,DQS有一个匹配的过程,Excel的MDS插件包括一个消除记录的方法。有时候,让SME来收拾残局要好得多。

我怀疑你能做到100%防弹,但你考虑过用levenshtein差异来代替吗?这听起来似乎是个完美的选择。我知道mysql中有一些实现,但在“外部”中可能更容易实现——即在visual studio中,在您的情况下(我在该部门没有提供任何内容)注意:我删除了mysql标记,添加了sql标记,并更改了标题检查SSIS中的模糊分组组件。这是用于此确切目的的工具:。MS使用自己的算法进行匹配,但效果令人惊讶well@MarkWojciechowicz我以前尝试过模糊分组,但所做的只是返回整个account表集,其相关值为0.0-1.0。我要寻找的是一个过程,它将分析表中的所有帐户,并返回一个单独的表,其中只包含可能的帐户重复项