【发布时间】:2016-07-01 23:26:45
【问题描述】:
我和我的团队很想确定我们可以匹配两组不同数据的最佳方式。没有可以连接的键,因为这些数据来自两个彼此一无所知的独立来源。我们将这些数据导入到两个 oracle 表中,一旦完成,我们就可以开始寻找匹配项。
两个表都包含完整的属性列表(如房地产)。我们需要将表 1 中的属性与表 2 中找到的任何潜在匹配属性进行匹配。对于表 1 中的每条记录,在表 2 中搜索潜在匹配并确定匹配的概率。我和我的团队决定最好的方法是比较两个表中的地址字段。
一个问题是 Table1 以 Parsed 格式提供地址,并将地址编号、地址 Street 甚至 Address_type 分配到单独的列中,而 Table2 仅包含一列来保存地址。每个表都有可以单独比较的 City、State 和 Zip 列。
例如 - 见下表1和表2:
请注意,下面我的伪表中的主键是与它们所在的表匹配的 Key1 和 Key2。
+---------------+---------------+---------------+---------------+---------------+-------+-------+
+ + TABLE1 + + + + + +
+---------------+---------------+---------------+---------------+---------------+-------+-------+
| Key1 | Addr_Number | Addr_Street | Addr_Type | City | State | Zip |
+---------------+---------------+---------------+---------------+---------------+-------+-------+
| 1001 | 148 | Panas | Road | Robinson | CA | 76050 |
| 1005 | 110 | 48th | Street | San Juan | NJ | 8691 |
| 1009 | 8571 | Commerce | Loop | Vallejo | UT | 83651 |
| 1059 | 714 | Nettleton | Avenue | Vista | TX | 29671 |
| 1185 | 1587 | Orchard | Drive | Albuquerque | PA | 77338 |
+---------------+---------------+---------------+---------------+---------------+-------+-------+
+---------------+----------------------+---------------+---------------+---------------+
+ + TABLE2 + + + +
+---------------+----------------------+---------------+---------------+---------------+
| Key2 | Address | City | State | Zip |
+---------------+----------------------+---------------+---------------+---------------+
| Ax89f | 148 Panas Road | Robinson | CA | 76050 |
| B184a | 110 48th Street | San Juan | NJ | 08691 |
| B99ff | 8571 Commerce Lp | Vallejo | UT | 83651 |
| D81bc | 714 Nettleton Ave | Vista | TX | 29671 |
| F84a2 | 1587 Orachard Dr | Albuquerqu | PA | 77338 |
+---------------+----------------------+---------------+---------------+---------------+
这里的目标是向用户提供一个输出,该输出仅显示 Table1 中的所有记录以及在 Table2 中找到的最高匹配记录。当然,可能会发现许多可能是潜在匹配的记录,但我们希望保持这种一对一的关系,并且不会在此初始输出中产生重复项。输出应该只是表 1 中的一条记录,与表 2 中的最佳结果相匹配。
请参阅下面我尝试创建的所需输出的示例:
+--------+-------+----------------+---------------------------+
+ + + Matched_Output + +
+--------+-------+----------------+---------------------------+
| Key1 | Key2 | Percent_Match | num_Matched_Records > 90% |
+--------+-------+----------------+---------------------------+
| 1001 | Ax89f | 100% | 5 | --All Parsed Values Match
| 1005 | B184a | 98% | 4 | --Zip Code prefixed with Zero in Table 2
| 1009 | B99ff | 95% | 3 | --Loop Vs Lp
| 1059 | D81bc | 95% | 2 | --Avenue Vs Ave
| 1185 | F84a2 | 97% | 2 | --City Spelled Wrong in Table 2 and Drive vs Dr
+--------+-------+----------------+---------------------------+
在输出中,我想查看 Table1 中的 Key1 以及它旁边的匹配记录,显示它与 Table2 到 Key2 中的记录匹配。接下来我们需要知道这两条记录的匹配程度。表 2 中可能有许多记录显示匹配表 1 中记录的概率。事实上,表 2 中的每条记录都可以分配一个百分比,从 0% 到 100% 匹配。
现在回到主要问题: 如何获得这个百分比?
如何解析表 2 中的地址列,以便比较构成表 1 中地址的每一列,然后对每个解析值应用比较算法?
到目前为止,这是我和我的团队提出的(头脑风暴、Spitballin,随便你怎么称呼它)。
我们查看了几个内置的 Oracle 函数以获得我们正在寻找的百分比以及尝试使用正则表达式。如果我可以访问谷歌并获得他们的一些搜索算法,我会的。显然我没有那种奢侈,必须自己设计。
regexp_count(table2_city,'(^| )'||REPLACE(table1_city,' ','|')||'($| )') city_score,
regexp_count(table2_city,'(^| )') city_max,
to_char((city_score/city_max)*100, '999G999G999G999G990D00')||'%' city_perc,
以上只是我和我的团队用作概念证明的内容。我们只是从两个表中选择了这些值并针对这些列运行“regexp_count”函数。以下是我们查看的其他一些函数:
声音
REGEXP_LIKE
REGEXP_REPLACE
这些函数很棒,但我不确定它们是否可以在两个表之间的单个查询中使用以产生所需的输出。
另一个想法是,我们可以创建一个 Function(),将我们想要用来比较的地址字段作为其参数。然后,该函数将在 Table2 中搜索最大可能匹配并将 Table2 中的 Key2 值返回给用户。
Function(Addr_Number, Addr_Street, Addr_type, City, State) RETURN table2.key2
例如,也许这样的东西“可以”工作:
Select tb1.key1, table2Function(tb1.Addr_Number, tb1.Addr_Street, tb1.Addr_type, tb1.City, tb1.State) As Key2
From Table1 tb1;
最后,只知道Table1中当前大约有15k条记录,Table2中有20k条记录。再次... 表 1 中的每条记录都需要与表 2 中的每条记录进行核对以寻找潜在的匹配项。
我全神贯注。并提前感谢您的反馈。
【问题讨论】:
标签: oracle