Я пользуюсь функцией 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 'Джон Доу'. У меня может быть только одна «Джейн Доу», но она появится в результатах второго запроса.
Есть ли способ более точно получить только строки, которые используются для компиляции результатов первого запроса?