2016-05-02 4 views
1

名前のデータベースがあり、名前の一部が正しい方法で挿入されていません。 SecondNameがFirstNameとして入力されることがあります。"GROUP BY"を使用して2つのフィールドが似ているSQL

+-----------------+--------------+ 
| 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 
     ) 

を照会しようとしました。しかし、私は

+-----------------+--------------+---------+ 
| FirstName | SecondName | Count | 
+-----------------+--------------+---------+ 
| Bob    | Smith  | 2  | 
| John   | Jones  | 2  | 
+-----------------+--------------+---------+ 
+0

で簡単に別の重複を望むことができますか? – Hogan

+0

FirstNameとSecondNameが同じ回数を数えたいと思います。 – user2075215

+0

は理にかなっていませんが、あなたの例ではBob Smithが2となっています。 – Hogan

答えて

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()などがあります。
  • 正規化の一致に必要な他の列を追加または無視することができます。誕生日、中間の初期値など
  • 正規化された文字列のハッシュは、文字列よりも処理が高速です。どちらか一方。
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 
関連する問題