按单个表上的字符串相似性分组

时间:2019-06-11 05:23:35

标签: string oracle grouping matching

在满足以下要求时,我需要您的帮助来编写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%与表中的另一条记录匹配,则生成一个组ID(随机唯一ID)

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 个答案:

答案 0 :(得分:1)

这是一个普遍的要求,但是不幸的是,这是不合逻辑的,因此,当然不能实现。这就是问题所在:假设第1行和第2行的相似度超过90%(按WHATEVER定义)。还假设第2行和第3行的相似度超过90%。这两个假设并不意味着第1行和第3行的相似度超过90%!但是,您必须将第1行和第2行以及第2行和第3行分组在一起,因此第1、2、3行必须全部在同一组中(即使1和3不是“足够相似”)。

现在假设第5行和第6行不够相似。之后,我们添加第7行,与第5行的相似度超过90%,也与第6行的相似度超过90%。现在呢?现在,您必须将第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处于这种关系)。您正在使用的概念是自反和对称的关系,但不是过渡的-因此它不是等效关系。另一方面,将“事物”放入组在逻辑上与定义对等关系相同。您不能基于不可传递的关系来创建“组”。