SQL - 使用 "IS LIKE" 在 2 个表之间进行高级比较



好吧,这会有点混乱,所以请试着和我呆在一起。

我有一张这样的信息表。。。

Table Name: Customers
_____________________________
ID   | CompanyName | FirstName | LastName  | Phone
-------------------------------
1    | Joes        | Joe       | James     | 1233334444
2    | Kennys      | Kenny     | Johnson   | 2222334555
3    | Kellys      | Kelly     | Gibson    | 5454445445
4    | Ricks #1    | Rick      | Lawson    | 4545334222
5    | Johns #1    | Johny B   | James     | 4545222211
6    | Johns #2    | Johny     | James     | 4545222211
7    | Johns #3    | Johny     | James     | 4545222211
8    | Ricks #2    | Rick A    | Lawson    | 4545334222

我需要知道如何创建一个SQL语句,查找所有重复的记录,将它们相加,然后显示与找到的第一个公司名称重复的总数。

*这是陷阱-正如你从上表中看到的,有时他们会把自己的首字母和名字放在一起(例如,ID5和ID6是同一个人,但他把中间的首字母放在ID5中,你可以看到ID4和ID7也是如此)

我需要SQL语句来进行比较,首先匹配姓氏,然后在名字和公司名称上做一个"IS LIKE",以确保它们被计算为应该的值。

例如-我应该得到类似于…的结果

Table Name: TableResults
_____________________________
ID   | CompanyName | FirstName | LastName  | Phone       | Count
-------------------------------
4    | Ricks #1    | Rick      | Lawson    | 4545334222  | 2
5    | Johns #1    | Johny B   | James     | 4545222211  | 3

这可能吗?

我认为您可能需要使用模糊匹配。

试试这个:

WITH InitialData AS
(
  SELECT *, SOUNDEX(LastName) + SOUNDEX(CompanyName) Similarity 
    FROM Customers
), FinalData AS
(
  SELECT *, 
          ROW_NUMBER() OVER(PARTITION BY Similarity ORDER BY ID) Position,
          COUNT(1)  OVER(PARTITION BY Similarity) Count
  FROM InitialData
)
SELECT ID, CompanyName, FirstName, LastName, Phone, Count
  FROM FinalData
WHERE Position = 1
  AND Count > 1

SQLFiddle:http://sqlfiddle.com/#!3/7c1fb/2

如果可能的话,我相信名称分析将是一些非常复杂的SQL。首先,您可能需要确保名称列使用不区分大小写的排序规则,如utf8_general_ci。我不相信人们会一直把自己的名字大写。如果他们不小心的话,他们也可能有打字错误。

LIKE不够聪明,无法在差异很小的字符串上进行匹配,除非您确切地知道将%放在哪里。它不仅仅是一个通配符匹配函数。

也许可以使用SOUNDEX算法结账?但只有当你的所有数据都是英文时,这才有效。

电话号码是识别重复号码的可靠方法吗?如果是这样的话,你可以跳过名称分析,只做以下操作:

SELECT ID, CompanyName, FirstName, LastName, Phone, COUNT(1) AS Count
FROM Customers 
GROUP BY Phone
ORDER BY ID ASC

相关内容

  • 没有找到相关文章

最新更新