2017-03-22 21 views
0

이름과 주소 같은 고객 정보가있는 두 개의 테이블이 있습니다.두 테이블 간의 퍼지 일치

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 

전체 주소를 기반으로 위의 두 테이블간에 퍼지 일치를 수행하는 가장 좋은 방법은 무엇인지 알고 싶습니다. 퍼지 일치는 퍼지 Vlookup처럼 작동해야하며 나에게 단 하나의 최상의 경기를 제공해야합니다.

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

버전 가장 높은 유사성 %의

예와 행만 반환 row_number()

3) 2) 중복 제거? Oracle Text를 살펴 보았습니까? https://community.oracle.com/thread/3583139 및 https://docs.oracle.com/cd/E11882_01/text.112/e24436/csql.htm#CCREF0104 여기에서 살펴보십시오. 이렇게 할 수있는 능력이 있어야합니다 ... – sers

답변

3

시도 UTL_MATCH 패키지. 문자열 간의 유사성을 계산하는 데는 두 가지 기능이 있습니다.

해야 할 단계.

1) UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress) > 0에서 0.1과 t2를 결합하십시오 .0은 유사도의 백분율입니다. 50 이상으로 설정하도록 권유합니다.

오라클의

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