匹配来自两个表的人口统计信息,没有唯一标识符

Dav*_*bbz 1 sql oracle oracle11g

我具有表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
Run Code Online (Sandbox Code Playgroud)

表B:


F_Name  S_Name  DOB      SSN
Dave    Sammy   1/2/1980 223-45-6789
Run Code Online (Sandbox Code Playgroud)

没有可能用于连接两个表的唯一标识符。

通过查看上述样本数据,我想将David Sam 1/1/1980 123-45-6789(来自表A)和Dave Sammy 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
Run Code Online (Sandbox Code Playgroud)

Lit*_*oot 5

Jaro-Winkler的相似性可能会有所帮助。看下面的例子:

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>
Run Code Online (Sandbox Code Playgroud)

我将限制设置为80,但您可能会做出不同的决定。删除该WHERE子句(第17-21行)并检查返回的结果,然后您将对所发生的事情有一个更清晰的了解。