好吧,这会有点混乱,所以请试着和我呆在一起。
我有一张这样的信息表。。。
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