前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >DuckDB 复杂关联

DuckDB 复杂关联

作者头像
披头
发布2024-11-21 11:26:26
发布2024-11-21 11:26:26
7200
代码可运行
举报
文章被收录于专栏:datartisandatartisan
运行总次数:0
代码可运行

现实工作中,有一些场景需要关联,然而却不能直接进行关联,因为关联键并不直接存在,只有经过处理后才可以进行关联,今天,我们通过一个例子来学习一下。

需求背景

假设有通过笔试的候选人名单如下:

pid

name

1

张三

2

李四

3

王五

4

赵六

经过面试、体检及背调等复核工作,发现部分成员存在问题,不能正常入取,示例数据如下:

check_type

names

health

张三、赵六

age

李四

现在要求筛查出符合所有考核要求的候选人名单。

解决思路

要求从通过笔试的候选人名单中,剔除复核过程中不达标的人员。难点在于候选人名单和复核情况名单关键字段结构不一致,候选人的姓名是独立的,而复核表中的姓名是拼接在一起的。

具体到解决思路,有以下几种可以参考:

1、以复核表为基础,把拼接的姓名拆分到行,然后再关联

2、通过正则匹配来关联

3、通过模糊匹配来关联

4、LISTAGG 拼接所有姓名,使用 INSTR 来剔除不达标人员

方法一:拆分到行

首先,将复核表中拼接的姓名拆分到行

代码语言:javascript
代码运行次数:0
复制
select check_type, regexp_split_to_table(cnames, '、') cname
from t2;

查询结果:

check_type

cname

health

张三

health

赵六

age

李四

将候选人表与拆分到行的复核表进行关联

代码语言:javascript
代码运行次数:0
复制
select a.cname 
from t1 a
left join (select check_type, regexp_split_to_table(cnames, '、') cname
             from t2) b
on a.cname = b.cname
where b.cname is null;

查询结果:

cname

王五

方法二:正则匹配

首先,将候选人表与复核表进行模糊关联,查找在复核表中出现过的候选人

代码语言:javascript
代码运行次数:0
复制
select t1.cname
  from t1  
  join t2 
    on regexp_matches(t2.cnames,concat(t1.cname, '.*'));

查询结果:

cname

张三

赵六

李四

剔除复核表中出现的候选人

代码语言:javascript
代码运行次数:0
复制
select cname
from t1
where cname not in (
                     select t1.cname
                       from t1 
                       join t2 
                         on regexp_matches(t2.cnames,concat(t1.cname, '.*'))
                         );

查询结果:

cname

王五

方法三:模糊匹配

使用模糊匹配 + NOT EXISTS 语法

代码语言:javascript
代码运行次数:0
复制
select cname
  from t1 a
 where not exists (select cnames from t2 b where b.cnames like '%'||a.cname||'%');

查询结果:

cname

王五

方法四:listagg + instr

首先使用 listagg 拼接复核表中所有姓名

代码语言:javascript
代码运行次数:0
复制
select listagg(cnames,'、') AS x from t2;

查询结果:

x

张三、赵六、李四

使用 INSTR 剔除在复核表中出现的候选人

代码语言:javascript
代码运行次数:0
复制
with a as (select listagg(cnames,'、') AS x from t2)
select cname 
from t1, a
where instr(a.x, cname) = 0;

查询结果:

cname

王五

至此,四种方法全部介绍完了,你最喜欢哪一种呢?欢迎留言讨论。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学探究 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求背景
  • 解决思路
  • 方法一:拆分到行
  • 方法二:正则匹配
  • 方法三:模糊匹配
  • 方法四:listagg + instr
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档