繁体   English   中英

使用SQL进行重复数据删除,选择相似的字段

[英]Using SQL for deduplication, SELECT similar fields

我有一个在“ CustomerName”字段中包含500多个客户名称的访问订单数据库

问题在于,随着订单的输入,我们的销售团队有时会以不同的方式键入名称。 (“ ACME Inc”与“ ACME,Inc.”)。现在,我有几个客户实际上是同一家公司,但外观却有所不同。

到目前为止,我已经编写了一个查询,该查询显示了不同的CustomerName值,现在我需要一个基本上可以遍历所有这些并显示名称相似之处的查询。 也许名字的前十个字母匹配? 或理想情况下,如果一定比例的名称字母匹配。

我不知道该怎么做,我们将不胜感激。

非常感谢!

您可以拆分“”上的所有客户列,然后在like子句中将它们与%一起加入,这将有助于找到ACME,Inc,因为它将与ACME Inc一起匹配%ACME%Inc%

没有庞大的公司数据库,我很难测试这一点,但也许这个想法会有所帮助。

这取决于名称的变化方式。 如果仅是标点符号,大小写等,则可以剥离它们并基于此进行比较。 如果它比较复杂,例如“ Inc,ACME”和“ ACME Incorporated”,则必须编写一个函数来比较两个字符串以对其进行评分/排名。

查找两个字符串的相似程度

上面的链接指向另一个SO问题,该问题讨论通常用于执行此操作的不同算法。

Excel中的Levenshtein距离

上面的链接指向一个SO问题,该问题具有VBA中方法之一的实现

您只有500个客户名称。 以唯一的名称并将其放在Excel中。 对它们进行排序,然后为其分配“真实”客户名称。

这应该少于一个小时。

然后,将其上传到数据库中的新表。 新表将具有“真实客户名称”和“备用名称”。 访问表时,请执行联接以获取真实姓名。

这解决了紧迫的问题。

然后,您可以更新数据库中的数据以使用“真实”名称。

并且,您可以将输入法更改为以下之一:

  • 让销售人员从有效名称列表中进行选择。 或者,通过一个过程来创建新客户。
  • 如果客户名称不在“真实”列表中,则拒绝上传到系统中的数据。 然后,如果是真正的新客户,则手动添加名称,然后重新加载数据。

您正在处理500个名称,而不是500,000个名称。 手动过程是完全可行的。 试图让SQL匹配相似的名称很难。 与实际解决问题相比,您将花费更多的时间进行此操作。

此语法适用于sql server。 访问逻辑相同。 我不确定语法。 这是自我加入。

select your fields
from yourtable t1 join yourtable t2
on left(t1.namefield, 10) = left(t1.namefield, 10)
and t1.namefield <> t2.namefield

这样就可以记录前10个字符相同的位置。 但是,对于您正在尝试的内容,我认为它不够彻底。 我认为您必须遍历整个数据库。

此外,您可能希望在修正过去之前考虑修正未来。 换句话说,做一些防止再次发生的事情,这样您只需要做一次即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM