Как идентифицировать уникальных людей в таблице MySQL, используя более одного критерия - PullRequest
0 голосов
/ 18 августа 2011

У меня есть таблица записей ~ 200k dat людей с их идентификационными данными, а также датой и результатом теста, вот фиктивная версия:

+----+---------+----------+------------+----------+------------+--------+
| id | surname | forename | dob        | SchoolID | testDate   | result |
+----+---------+----------+------------+----------+------------+--------+
|  1 | Smith   | Mary     | 1980-04-11 | NULL     | 2005-10-12 |  14.32 |
|  2 | Smith   | Mary     | 1980-04-11 | 1234     | 2007-03-02 |   18.1 |
|  3 | Jones   | Kim      | 1978-10-24 | 4657     | 2002-04-14 |  24.31 |
|  4 | Jones   | Kim      | NULL       | 4567     | 2002-10-08 |  19.02 |
|  5 | Roberts | Kim      | 1978-10-24 | 4567     | 2003-12-18 |  14.19 |
|  6 | Roberts | Kim      | 1978-10-24 | 4567     | 2005-02-11 |  18.26 |
+----+---------+----------+------------+----------+------------+--------+

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

  • фамилия, имя и фамилия совпадают (так как SchoolID часто отсутствует или неверен)
  • фамилия, имя и SchoolID одинаковы (поскольку DOB иногда не вводится или вводится неправильно)
  • имя, dob и SchoolID совпадают (люди иногда вступают в брак)
  • и т. д.

В приведенном выше примере в таблице только два уникальных человека: Мэри Смит и Ким Робертс, урожденная Джонс, так что этот столбец uniqueID в итоге должен быть:

+----+----------+
| id | uniqueID |
+----+----------+
|  1 |        1 |
|  2 |        1 |
|  3 |        2 |
|  4 |        2 |
|  5 |        2 |
|  6 |        2 |
+----+----------+

Несмотря на то, что я несколько лет баловался с MySQL, я все еще новичок.Я искал и пробовал несколько дней, и до сих пор мне это удавалось:

SELECT surname, forename, SchoolID 
   FROM dat 
   GROUP BY CONCAT(surname, forename, SchoolID);

, что является вторым критерием, например (то, что я планировал дать автоинкрементный ключ)в новую таблицу, затем присоединитесь как уникальный идентификатор), но я не очень разбираюсь в этих нескольких критериях, поэтому любая помощь очень ценится!

Спасибо Ник

Ответы [ 2 ]

0 голосов
/ 18 августа 2011

Вы можете сделать это через самостоятельные соединения. Я бы сделал это в несколько этапов - от лучшего до самого слабого матча.

Итак, если предположить, что schoolID является надежным в момент его появления, вы найдете дубликаты следующим образом:

select *
from   dat parent, 
       dat child
where  parent.id      <> child.id
and    parent.schoolid =  child.schoolid

(Извинения за допотопный синтаксис соединения).

Запустите это, и посмотрите, есть ли у вас странности; если вам это нравится, включите его в обновление. Обновления с самостоятельным объединением в MySQL немного болезненны, и самый простой способ - создать представление для объединения.

create view dupes as

select   min(parent.id) as uniqueid, child.id
from     dat parent, 
         dat child
where    parent.schoolid =  child.schoolid
group by child.id

update  ignore dat, dupes
set     dat.uniqueid =   dupes.uniqueid
where    dat.id      = dupes.id

Теперь вы переходите ко второй самой сильной ссылке, что-то вроде:

    select *
    from   dat parent, 
           dat child
    where  parent.id      <> child.id
    and    parent.uniqueID is  null
    and    child.uniqueID  is  null
    and    parent.forename = child.forename
    and    parent.surname  = child.surname
    and    parent.dob      = child.dob

Опять же, запустите его, проверьте данные на странности, превратитесь в оператор обновления.

Далее, ослабьте ограничения - это нормально, если мы ранее сопоставили родительский элемент с другой записью, поэтому мы можем убрать проверку на null:

select *
from   dat parent, 
       dat child
where  parent.id      <> child.id
and    child.uniqueID  is  null
and    parent.forename = child.forename
and    parent.surname  = child.surname
and    parent.dob      = child.dob

И так далее, и так далее. Работая с наибольшей вероятностью, вы уменьшаете риск довольно незначительного сходства, переопределяющего четкую связь (например, два человека по имени «Ким», родившиеся в 1978-10-24,

Запустив сначала выбор, а затем превратив их в обновления, вы избежите человеческой ошибки.

0 голосов
/ 18 августа 2011

вы пробовали "ВЫБРАТЬ разные"?

...