【问题标题】:Group by similarity of string on a single table按单个表上字符串的相似性分组
【发布时间】:2019-10-25 11:30:21
【问题描述】:

我需要您的帮助来编写满足以下要求的 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');

【问题讨论】:

    标签: string oracle grouping matching


    【解决方案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 处于这种关系中)。您正在使用的概念是自反和对称的关系,但它不是传递的 - 因此它不是等价关系。另一方面,将“事物”分组在逻辑上与定义等价关系相同。您不能基于不可传递的关系创建“组”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2018-09-15
      • 2019-03-03
      • 1970-01-01
      相关资源
      最近更新 更多