Это трудно сделать в sql. Но я предложу подход. Разделите имена на токены по пробелам, а затем посмотрите, сколько токенов совпадают между именами компаний.
Как только вы определите «порог» числа, вам понадобится какое-то ручное вмешательство, чтобы решить, какие из них являются хорошими совпадениями.
После этого вы получите представление о том, сколько из них, вероятно, совпадают. Это должно помочь в агрегации логи c.
Например: в последнем запросе поля (cnt_token) и (cnt_matching_tokens) сообщают, что «Решающие данные» имеют 2 из 2 совпадений с «Решающими данными в c.»
X Y B_Y TOKEN_VAL CNT_TOKENS CNT_OF_MATCHING_TOKENS
1000 Decisive Data Decisive Data Inc. Decisive 2 2
1000 Decisive Data Decisive Data Inc. Data 2 2
create table t(x int, y varchar2(500));
insert
into t
select 1000 ,'Decisive Data' from dual union all
select 1001 ,'Decisive Data, Inc.' from dual union all
select 1002 ,'Decisive Data Inc.' from dual union all
select 1003 ,'Thomson ABC Data ' from dual union all
select 1004 ,'Thomson ABC Data Pvt Ltd' from dual union all
select 1005 ,'Susheel Solutions R K' from dual union all
select 1006 ,'Susheel R K Sol' from dual union all
select 1007 ,'R K Susheel Data Solutions' from dual union all
select 1008 ,'GMR Infra' from dual union all
select 1009 ,'GMR Infra Projects' from dual union all
select 1010 ,'GMR Infrastructure Projects Ltd' from dual;
commit;
--Example using jaro_winkler_similarity of string.
select * from(
select a.x,a.y as a_y,b.x as b_x,b.y,round(utl_match.jaro_winkler_similarity(a.y,b.y),2) as similar_dist
from t a
join t b
on a.x <> b.x
)m
where m.similar_dist>=80
--comparision based on tokens of the name
with data /*This would split the name into rows based on <space>*/
as (select distinct x,y, replace(trim(regexp_substr(y,'[^ ]+', 1, level) ),',','') as token_val, level
from t
connect by regexp_substr(y, '[^ ]+', 1, level) is not null
)
,data2
as(
select x,count(token_val) as cnt_tokens
from data
group by x
)
select * from (
select a.x,a.y,b.y as b_y,a.token_val
,a1.cnt_tokens
,count(*) over(partition by a.y,b.y) as cnt_of_matching_tokens
from data a
join data2 a1
on a.x=a1.x
left join data b
on a.token_val=b.token_val
and a.x <> b.x
)y