Соответствие демографии из двух таблиц без уникальных идентификаторов - PullRequest
1 голос
/ 23 сентября 2019

У меня есть Таблица A и Таблица B со следующими образцами демографических данных и столбцами.

Таблица A:


F_Name  S_Name  DOB         SSN
David   Sam     1/1/1980    123-45-6789
David   Lieser  10/7/1940   987-65-4321
John    Doe     12/31/2001  500-00-0000

Таблица B:


F_Name  S_Name  DOB      SSN
Dave    Sammy   1/2/1980 223-45-6789

ТамНе существует уникальных идентификаторов, которые можно использовать для объединения двух таблиц.

Глядя на приведенные выше примеры данных, я хотел бы получить Дэвид Сэм 1/1/1980 123-45-6789 (из таблицы A) и Дейв Сэмми 1/ 2/1980 223-455-6789 (из таблицы B) как потенциально одни и те же люди - обоснование состоит в том, что DOB, SSN достаточно близки с одной или несколькими цифрами, возможно, из-за ошибки ввода данных человеком иназвания звучат одинаково или достаточно похожи или идентичны.Как мне этого добиться?


F_Name S_Name DOB      SSN          F_Name_1 S_Name_1  DOB_1    SSN_1
David  Sam    1/1/1980 123-45-6789  Dave     Sammy     1/2/1980 223-455-6789

1 Ответ

5 голосов
/ 23 сентября 2019

Может помочь сходство Джаро-Винклера.Посмотрите на следующий пример:

SQL> with
  2  table_a (fname, sname, dob, ssn) as
  3    (select 'David', 'Sam'   , date '1980-01-01', '123-45-6789' from dual union all
  4     select 'David', 'Lieser', date '1940-10-07', '987-65-4321' from dual union all
  5     select 'John' , 'Doe'   , date '2001-12-31', '500-00-0000' from dual
  6    ),
  7  table_b (fname, sname, dob, ssn) as
  8    (select 'Dave', 'Sammy'  , date '1980-01-02', '223-45-6789' from dual
  9    )
 10  select a.fname, a.sname, a.dob, a.ssn,
 11         b.fname, b.sname, b.dob, b.ssn,
 12    utl_match.jaro_winkler_similarity(a.fname, b.fname) jws_fname,
 13    utl_match.jaro_winkler_similarity(a.sname, b.sname) jws_sname,
 14    utl_match.jaro_winkler_similarity(to_char(a.dob, 'yyyymmdd'), to_char(b.dob, 'yyyymmdd')) jws_dob,
 15    utl_match.jaro_winkler_similarity(a.ssn, b.ssn) jws_ssn
 16  from table_a a cross join table_b b
 17  where
 18        utl_match.jaro_winkler_similarity(a.fname, b.fname) >= 80
 19    and utl_match.jaro_winkler_similarity(a.sname, b.sname) >= 80
 20    and utl_match.jaro_winkler_similarity(to_char(a.dob, 'yyyymmdd'), to_char(b.dob, 'yyyymmdd')) >= 80
 21    and utl_match.jaro_winkler_similarity(a.ssn, b.ssn) >= 80;

FNAME SNAME  DOB      SSN         FNAM SNAME DOB      SSN          JWS_FNAME  JWS_SNAME    JWS_DOB    JWS_SSN
----- ------ -------- ----------- ---- ----- -------- ----------- ---------- ---------- ---------- ----------
David Sam    01.01.80 123-45-6789 Dave Sammy 02.01.80 223-45-6789         84         90         95      93

SQL>

Я установил ограничение на 80 , но вы можете принять другое решение.Удалите предложение WHERE (строки # 17 - 21) и проверьте возвращаемые результаты, тогда у вас будет более четкое представление о том, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...