好的,这会变得有点乱,所以请尽量和我在一起..
我有一张像这样的信息表...
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语句,找到所有重复记录,添加它们,然后显示找到的第一个公司名称的重复记录总数。
* HERE的主题 - 从上表中可以看出,有时候他们会在姓名中加上他们的名字缩写(例如 - 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
这甚至可能吗?
答案 0 :(得分:2)
我认为您可能需要使用模糊匹配。
试试这个:
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
答案 1 :(得分:0)
我认为名称分析将是一些非常复杂的SQL,如果可能的话。首先,您可能需要确保您的名称列使用Case- 不敏感排序规则,例如utf8_general_ci
。我不相信人们会不断地将他们的名字大写。如果他们粗心大意,他们也可能有拼写错误。
LIKE
的位置,否则 %
不够智能,无法匹配差异较小的字符串。它更像是一个通配符匹配函数。
也许使用SOUNDEX算法结账?但只有当您的所有数据都是英文时才会有效。
电话号码是否是识别重复项的可靠方法?如果是这样,您可以跳过名称分析,然后执行此操作:
SELECT ID, CompanyName, FirstName, LastName, Phone, COUNT(1) AS Count
FROM Customers
GROUP BY Phone
ORDER BY ID ASC