Sql 加入以与可能交换的数据执行比较匹配
我试图在Sql 加入以与可能交换的数据执行比较匹配,sql,snowflake-cloud-data-platform,snowsql,Sql,Snowflake Cloud Data Platform,Snowsql,我试图在snowflake中对目标表(700K行)和源表(150万行)中的名字、中间名字和姓氏进行比较匹配。first\u name、middle\u name和last\u name中的值可以在source表中部分交换或完全交换,也就是说first\u name中的值可以与last\u name中的值交换或以任何其他方式交换。对于肯定的可能识别,至少需要两个匹配项是正确的。然后我做进一步的处理以保证比赛的准确性 示例: 案例1:名字(目标)=名字(来源)|中间名(目标)=中间名。(比赛) 案例
snowflake
中对目标表(700K行)和源表(150万行)中的名字、中间名字和姓氏进行比较匹配。first\u name
、middle\u name
和last\u name
中的值可以在source
表中部分交换或完全交换,也就是说first\u name
中的值可以与last\u name
中的值交换或以任何其他方式交换。对于肯定的可能识别,至少需要两个匹配项是正确的。然后我做进一步的处理以保证比赛的准确性
示例:
案例1:名字(目标)=名字(来源)|中间名(目标)=中间名。(比赛)
案例2:名字(目标)=姓氏(源)|中间名(目标)=中间名(源)|姓氏(目标)=名字(源)->与lame交换的名字(匹配)
示例(带表格):
Target Table
id | first_na_t | middle_name_t | last_name_t
1 | ffa | mma | lla
2 | ffa | mmb | lla
3 | ffb | ffa | llb
4 | ffc | mmd | lla
...
Source Table
id | first_name_s | middle_name_s | last_name_s
1 | lla | mmb | ffa
5 | ffa | mmb | lla
3 | ffb | ffa | llb
4 | mmd | ffc | lla
...
从示例表中,我尝试将目标
表中的第一行与源
表中的所有其他行进行比较,之后使用交叉连接
和案例
,但这被证明是低效且缓慢的
有没有办法巧妙地将连接到中,将目标
表中的行与源
表中的行进行比较,得出至少2个匹配项,即使任何名称
列都可以交换。另外,我不能使用id
列。您可以这样表达逻辑:
from TARGET_TABLE T join
SOURCE_TABLE S
on ((case when s.FIRST_NAME_s in (t.FIRST_NAME_T, t.MIDDLE_NAME_T, t.LAST_NAME_T then 1 else 0 end) +
(case when s.MIDDLE_NAME_s in (t.FIRST_NAME_T, t.MIDDLE_NAME_T, t.LAST_NAME_T then 1 else 0 end) +
(case when s.LAST_NAME_s in (t.FIRST_NAME_T, t.MIDDLE_NAME_T, t.LAST_NAME_T then 1 else 0 end)
) >= 2
然而,这可能需要很长时间才能实现
相反,让我们将名称分成单独的行并聚合:
select t.id, s.id
from (target_table t cross join lateral
(values (t.first_name_t), (t.middle_name_t), (t.last_name_t)
) vt(name)
) join
(source_table t cross join lateral
(values (s.first_name_s), (s.middle_name_s), (s.last_name_s)
) vs(name)
)
on vt.name = vs.name
group by t.id, s.id
having count(*) >= 2;
注意:如果一个名称中的不同名称组件相同,这可能会有点混乱,但是如果需要,您可以调整逻辑来处理它。是为postgress
编写的第二个查询,因为我在尝试运行fit insnowflake
时不断出错?@Lukasz。也许雪花需要逗号而不是交叉连接。