2017-03-22 3 views
0

J'ai deux tables avec des informations sur le client comme le nom et l'adresse.Correspondance floue entre deux tables

ID Name Full Address 
1 Anurag 123 CA USA 5001 
2 Mike ABC CA USA 5002 
3 Jason ZYZ TX USA 5003 
4 Roshan HBC MS USA 5004 
5 Tony UYS VT USA 5005 

New_ID Name   Full Address 
111 Anurag CH  123 3 Floor CA USA 5001 
112 Mike Martin  ABC 2 floorCA USA 5002 
113 Jason Bond  ABC farms USA 4008 
114 Roshan Kappor HBC MS USA 5004 
115 Tony Smith  UYS VT USA 5005 
116 Anurag   123 CA USA 5001 

Je voulais savoir quelle est la meilleure façon de faire une correspondance floue entre deux tables au-dessus de l'adresse complète. Le match flou devrait fonctionner comme un Vlookup flou et ne devrait me fournir qu'un seul meilleur match.

Desired Output 

ID Name Full Address New ID Name   Full Address  Match Score 
1 Anurag 123 CA USA 5001 116  Anurag   123 CA USA 5001  100 
2 Mike ABC CA USA 5002 112  Mike Martin ABC2floorCA USA 5002 90 
3 Jason ZYZ TX USA 5003 113  Jason Bond  ABC farms USA 4008  89 
4 Roshan HBC MS USA 5004 114  Roshan Kappor HBC MS USA 5004   90 
5 Tony UYS VT USA 5005 115  Tony Smith  UYS VT USA 5005   90 
+0

Quelle version d'Oracle? Avez-vous regardé Oracle Text? Jetez un oeil ici https://community.oracle.com/thread/3583139 et ici https://docs.oracle.com/cd/E11882_01/text.112/e24436/csql.htm#CCREF0104. La capacité de le faire devrait être là ... – sers

Répondre

3

essayez le package UTL_MATCH. Il y a deux fonctions pour calculer la similarité entre les chaînes.

Étapes à suivre.

1) Joindre t1 à t2 sur UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress) > 0 .0 est le pourcentage de similarité. Je recommande de le définir à 50 ou plus.

2) avec Déduplication row_number()

3) ne retournant que les lignes avec pour cent de similarité la plus élevée

Exemple

with tab_1 (ID,name,full_adress) as(
select 1 ,'Anurag' ,'123 CA USA 5001' from dual union all 
select 2 ,'Mike' ,'ABC CA USA 5002' from dual union all 
select 3 ,'Jason' ,'ZYZ TX USA 5003' from dual union all 
select 4 ,'Roshan' ,'HBC MS USA 5004' from dual union all 
select 5 ,'Tony' ,'UYS VT USA 5005' from dual), 
tab_2 (ID_2,name_2,full_adress_2) as (
select 111 ,'Anurag CH'  ,'123 3 Floor CA USA 5001' from dual union all 
select 112 ,'Mike Martin'  ,'ABC 2 floorCA USA 5002' from dual union all 
select 113 ,'Jason Bond'  ,'ABC farms USA 4008' from dual union all 
select 114 ,'Roshan Kappor' ,'HBC MS USA 5004' from dual union all 
select 115 ,'Tony Smith'  ,'UYS VT USA 5005' from dual union all 
select 116 ,'Anurag'   ,'123 CA USA 5001' from dual) 
select * from (
select t1.*,t2.*, UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress_2) SIMILARITY_PERCENT, row_number() over(partition by t1.id order by UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress_2) desc) rn_rank from tab_1 t1 
join tab_2 t2 on UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress_2) > 0 
) where rn_rank = 1