Группировка по сходству строк в одной таблице - PullRequest
1 голос
/ 11 июня 2019

Мне нужна ваша помощь в написании запроса Oracle SQL для требования ниже.

Исходные данные, как показано ниже:

CLAIM_NUMBER       ADDRESS_1            ADDRESS_2
1001               220 CHIRAG ST         OHIO
1003               220  ST CHIRAG        OHIO
1004               19874 CURLEY AVE      ORLANDO
1005               10874  CURLEY AVE     ORLAND
1002               220 CHIRAG ST         OHIO
1006                579 MLK Dr           NASHVILLE

Требование: если ADDRESS_1 || ADDRESS_2> 90% соответствует другой записизатем в таблице сгенерируйте идентификатор группы (случайный уникальный идентификатор)

CLAIM_NUMBER       ADDRESS_1            ADDRESS_2     group_id
1001               220 CHIRAG ST         OHIO          134
1003               220  ST CHIRAG        OHIO          134
1004               19874 CURLEY AVE      ORLANDO       2985
1005               10874  CURLEY AVE     ORLAND        2985
1002               220 CHIRAG ST         OHIO          134
1006                579 MLK Dr           NASHVILLE     3098

WITH ACCT_GRP AS
(
SELECT NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_1)),'NA')||NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_2)),'NA') CONCAT ,
    CASE WHEN  
UTL_MATCH.JARO_WINKLER(
NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_1)),'NA')||NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_2)),'NA')
LAG(
NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_1)),'NA')||NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_2)),'NA')
) OVER 
  ( ORDER BY
    NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_1)),'NA')||NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_2)),'NA')
   )
) *100<=90
THEN rownum
ELSE
null
END SIMILARITY_PCT
from src_table
),
ACCT_GRP_SUB AS
(
select concat,SIMILARITY_PCT from ACCT_GRP where SIMILARITY_PCT is not null
)
select 
ACCOUNT_ID,ACCOUNT_ADDRESS_STR_1, ACCOUNT_ADDRESS_STR_2,
SIMILARITY_PCT
from src_table stg left join ACCT_GRP_SUB grp
on 
case when 
UTL_MATCH.JARO_WINKLER(
NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_1)),'NA')||NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_2)),'NA'),grp.concat
)*100>90 
then grp.concat else null end = grp.concat
order by NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_1)),'NA')||NVL(UPPER(TRIM(ACCOUNT_ADDRESS_STR_2)),'NA');

1 Ответ

1 голос
/ 11 июня 2019

Это общее требование, и, к сожалению, оно нелогично - и поэтому, конечно, оно не может быть реализовано.Вот в чем проблема: предположим, что строки 1 и 2 более чем на 90% похожи (по определению WHATEVER).Предположим также, что строки 2 и 3 более чем на 90% похожи.Эти два предположения НЕ подразумевают, что строки 1 и 3 более чем на 90% похожи!Тем не менее, вы должны сгруппировать строки 1 и 2 вместе, а также 2 и 3, поэтому строки 1, 2, 3 должны быть в одной группе (даже если 1 и 3 не «достаточно похожи»).

Теперь представьте, что строки 5 и 6 недостаточно похожи.Позже мы добавим строку 7, которая более чем на 90% похожа на строку 5, а также более чем на 90% похожа на строку 6. И что теперь?Теперь вы должны сгруппировать строки 5 и 6 вместе!

Пример оформления:

row 1  ABCDEFGHIJ
row 2  ABCDEFGHIX
row 3  ABCDEFGHYX

Все три строки имеют длину в десять букв.Строка 1 и строка 2 имеют 9 общих символов (в одинаковых позициях), поэтому по одному показателю они «похожи на 90%».То же самое со строками 2 и 3;но строки 1 и 3 схожи только на 80%.

Итог: вся концепция фатально ошибочна - нет уточнения формулировки проблемы, которая сделает его осмысленным.

Математическое (теоретическое, академическая) концепция, стоящая за этим обсуждением, - это «отношение эквивалентности»Отношение - это отношение эквивалентности, если оно рефлексивно (каждый элемент связан с самим собой), симметрично (если A и B находятся в отношении, то так же и B и A) и транзитивно (если A иB в этом отношении, как и B и C, тогда A и C находятся в отношении).Концепция, с которой вы работаете, является рефлексивным и симметричным отношением, но оно не является ПЕРЕХОДНЫМ - и, следовательно, это не отношение эквивалентности.С другой стороны, отбрасывание «вещей» в группы - это то же самое, что и определение отношения эквивалентность .Вы не можете создавать «группы» на основе отношения, которое не является транзитивным.

...