【发布时间】:2015-09-24 02:39:48
【问题描述】:
我正在使用 Dynamics CRM 2015 在线并被赋予从活动帐户中删除重复项的任务。
我目前正在使用带有 COZYROC SSIS+ 包的 Visual Studio 2012 SSIS。
在将所有活动帐户拉入表 ActiveAccounts(所有 15000 个帐户)后,我创建了表 NormalNameOccurrences(最初为 Null)和 ActiveAccountsPossibleDuplicateReport(最初为 Null)。起初,我生成了一个单独的列,为每个帐户分配了一个正常名称。正常名称的规则是:
无空格
无字母数字字符
'&' 符号被替换为'and'
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
然后我运行以下查询以对前 10 个字符的帐户进行分组
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 和 6565652626。
任何有关如何解决此问题的建议将不胜感激!
【问题讨论】:
-
我怀疑你可以做任何 100% 防弹的东西,但你有没有考虑过使用 levenshtein 的差异来代替?听起来它非常适合这个目的。我知道 mysql 中有一些实现,尽管在“外部”做可能更容易 - 即。在你的情况下在视觉工作室(我在那个部门没有什么可提供的)
-
注意我删除了mysql标签,添加了sql标签,并更改了标题
-
查看 SSIS 中的模糊分组组件。这是用于此确切目的的工具:msdn.microsoft.com/en-us/library/ms141764.aspx。 MS 使用自己的算法进行匹配,但效果出奇的好
-
@MarkWojciechowicz 我之前尝试过模糊分组,但所做的只是返回具有相关值 0.0-1.0 的整个帐户表集。我正在寻找一个过程,它将分析我表中的所有帐户并返回一个单独的表,其中仅包含可能的帐户重复
标签: sql sql-server ssis crm dynamics-crm-2015