0

好的,这会变得有点混乱,所以请试着和我在一起..

我有一个类似这样的信息表...

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 语句以首先匹配姓氏进行比较,然后对名字和公司名称“种类”进行“喜欢”,以确保它们被视为应有的数量。

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

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

这甚至可能吗?

4

2 回答 2

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

于 2012-07-10T23:35:27.710 回答
0

如果可能的话,我相信名称分析将是一些非常复杂的 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
于 2012-07-10T23:27:43.887 回答