两个字段相似的SQL,使用" GROUP BY"

时间:2016-05-02 18:50:47

标签: sql group-by

我有一个名字数据库,有些名字没有以正确的方式插入。 SecondName有时被输入为FirstName。

int* (*function)(int, (int (*k)(int *)));

我尝试了不同的分组查询

+-----------------+--------------+
|    FirstName    |  SecondName  |
+-----------------+--------------+
| Bob             | Smith        |
| Gary            | Rose         |
| John            | Jones        |
| Smith           | Bob          |
| Gary            | Oberstein    |
| Adam            | Sorbet       |
| Jones           | John         |
+-----------------+--------------+

但我无法得到任何东西

select `FirstName`
     , `SecondName`
  from `names`
 where ( `FirstName` 
       , `SecondName` ) 
    in ( select `FirstName`
              , `SecondName`
           from `names`
         group
             by `FirstName`
              , `SecondName`
         having count(*) > 1 
       )

2 个答案:

答案 0 :(得分:4)

有一个技巧可以做到这一点,你需要规范你的名字,快速的方法是你将名字和姓氏按字母顺序排列,然后对结果进行分组。

SELECT name_normalized, count(*) as c
FROM (
  SELECT CASE WHEN FIRSTNAME < LASTNAME THEN FIRSTNAME||LASTNAME
              ELSE LASTNAME|| FIRSTNAME END as name_normalized
  FROM names
) X
GROUP BY name_normalized

注意:

  • 这是一个简单的例子,如果您想查看原始值,可以将规范化结果添加为列。
  • 您可能需要其他规范化 - 这取决于您的规则。例如,UPPER()忽略大小写,TRIM()删除空格。
  • 您可以根据匹配规范化生成添加或忽略其他列 - 生日,中间初始等。
  • 对于规范化字符串,哈希值的时间比字符串更快 - 您的数据模型可能需要一个或另一个。

答案 1 :(得分:2)

如果COUNT()本身并不重要,您可以轻松地将重复项与INNER JOIN

分开
SELECT n.FirstName, n.SecondName, n2.FirstName, n2.SecondName
FROM Names n
INNER JOIN Names n2 on n.FirstName = n2.SecondName and n.SecondName = n2.FirstName