2015-09-09 2 views
0

Я пользуюсь функцией metaphone в PostgreSQL, чтобы найти дубликаты записей, которые, возможно, были написаны с ошибкой.SQL выбрать всю запись, найденную в группе

SELECT metaphone(first_name, 4), metaphone(last_name, 4) 
FROM people GROUP BY metaphone(last_name, 4), 
metaphone(first_name, 4) HAVING COUNT(*) > 1; 

Это здорово показал мне есть, по крайней мере, 100 потенциальных дубликатов в нашей базе данных, но я не в состоянии делать с этим, потому что я не могу получить какой-либо однозначно идентифицирующую информацию из результатов запроса. Я пробовал:

SELECT person_id, first_name, last_name 
FROM people 
WHERE metaphone(first_name, 16) IN (
    SELECT metaphone(first_name, 16) 
    FROM people GROUP BY metaphone(last_name, 16), 
    metaphone(first_name, 16) HAVING COUNT(*) > 1 
) 
AND metaphone(last_name, 16) IN (
    SELECT metaphone(last_name, 16) 
    FROM people GROUP BY metaphone(last_name, 16), 
    metaphone(first_name, 16) HAVING COUNT(*) > 1 
) 
ORDER BY last_name, first_name; 

Какой вид работ, но все еще содержит некоторые записи, которые фактически не имеют соответствия обоих полей. Например, я мог бы иметь 2 'Джона Смита', 2 'Джейн Смит' и 2 'Джон Доу'. У меня может быть только одна «Джейн Доу», но она появится в результатах второго запроса.

Есть ли способ более точно получить только строки, которые используются для компиляции результатов первого запроса?

ответ

0

Вы должны делать оба сравнения сразу:

SELECT person_id, first_name, last_name 
FROM people 
WHERE (metaphone(first_name, 16), metaphone(last_name, 16) 
    ) IN (SELECT metaphone(first_name, 16), metaphone(last_name, 16) 
      FROM people 
      GROUP BY metaphone(first_name, 16), metaphone(last_name, 16), 
      HAVING COUNT(*) > 1 
      ) 
ORDER BY last_name, first_name; 
Смежные вопросы