希望您能帮助我解决下一个问题。我试图弄清楚在某些情况发生时如何计算存在的许多记录。

我的输入示例如下所示:

fullname    emailaddress1   telephone1
Juana Foster    juana
Juana Foster    juana       1933595322
Henzley                     1841901633
Henzley         henzley     1841901633
Hoyle           hoyle       1584190699
Hoyle           hoyle       1584190655
Aaron Jeans     alpha2222   1816808600
Aaron Jeans     alpha       1816808600
Erick Martin    a1009       1816250211
Erick Martin    martin      1565960141
Erick Martin    a1009
Erick Martin    martin      1565960141


我想将符合以下条件的出现分组:
 Fullname = Fullname and ((emailaddress = emailaddress and emailaddress != '') OR (telephone=telephone and telephone != ''))
换句话说,我要将所有具有相同全名和相同电子邮件或地址的行分组为一行。电子邮件和地址必须区分为空才能被视为可匹配。

预期的输出将是:

fullname     occurrences
Juana Foster  1
Henzley       1
Hoyle         1
Aaron Jeans   1
Erick Martin  2


我没有问题可以循环解决,但是我一直在思考如何在SQL中解决问题,并尝试了GROUP BY和UNIONS,但是我还没有找到解决方案。我正在使用mySQL。

更新:
我提供了一个包含更多具体案例的新示例,以澄清信息:
例如下一个输入
fullname emailaddress1 telephone1Aaron Jeans alpha2222 1816808600Aaron Jeans 1816808600Aaron Jeans alpha2222 1816808600Aaron Jeans alpha 1816808600Erick Martin a1009 1816250211Erick Martin a1009Erick Martin 1816250211Erick Martin martin 1565960141
Erick Martin martin 1565960141Nacho Mason 1111111111Nacho Mason 2222222222


在这种情况下,输出应为:
Aaron Jeans 1 Erick Martin 2 Nacho Mason 2

Aaron Jeans发生了1次,因为他的4条记录共享同一部电话。

埃里克·马丁(Erick Martin)有2次出现,第一个是针对以下情况:

Erick Martin a1009 1816250211Erick Martin a1009Erick Martin 1816250211

因为这3条记录共享相同的全名和(相同的电子邮件(a1009)或同一电话(1816250211),所以这3条记录被视为1次出现。
Erick Martin的第二次出现与接下来的两条记录匹配,因为它具有相同的全名,相同的电子邮件和相同的电话。

Erick Martin martin 1565960141
Erick Martin martin 1565960141


纳乔·梅森(Nacho Mason)发生了2次,因为他有2个不同的电话,并且他的电子邮件为空,因此不能视为相等。

最佳答案

我认为这可能是您要尝试执行的操作。
首先,您要对电子邮件不为空且电话不为空的所有事件进行选择

SELECT fullname,emailaddress1,telephone1,COUNT(*) AS occurrences
  FROM T
  WHERE emailaddress1 != ''
    AND telephone1 != ''
  GROUP BY fullname,emailaddress1,telephone1


那么现在您外部SELECT和MAX(occurrences)GROUP BY全名

SELECT fullname, MAX(occurrences) as occurrences
FROM
(SELECT fullname,emailaddress1,telephone1,COUNT(*) AS occurrences
  FROM T
  WHERE emailaddress1 != ''
    AND telephone1 != ''
  GROUP BY fullname,emailaddress1,telephone1
)AS result
GROUP BY fullname


sqlfiddle
至少,我认为这就是您要达到的目标。

但是很好奇,如果您有另一个全名,并且三行具有相同的电子邮件和电话号码,而另一个全名是具有另外两行相同的电子邮件和电话,像这样

Adam Smith   adam  1234
Adam Smith   adam  1234
Adam Smith   adam  1234
Adam Smith   smith 5678
Adam Smith   smith 5678


您要显示为Adam Smith 3还是Adam Smith 2或两者都显示?
上面的查询会给您Adam Smith 3

更新:我想根据您想要的输出,您需要亚当·史密斯3,因为有了您的Erick Martin 2,他会从内部选择中获得Erick Martin 1,Erick Martin 2。

10-07 13:39