匹配多个字段或字段的任意组合
Posted
技术标签:
【中文标题】匹配多个字段或字段的任意组合【英文标题】:match on several or any combination of fields 【发布时间】:2020-05-07 02:01:48 【问题描述】:我有这个表“HAVE”,我想要表 WANT 中的结果
有
fname lname dob sid gndr
john doe 20200101 1 M
john doe 20200101 M
john 20200101 1 M
doe 20200101 1 M
john doe 20200101 1
Karen Doe 20200101 2 F
WANT(new_id 可以是 rownum 或 sid)。注意 sid 是一个人的唯一标识符
fname lname dob sid gndr new_id
john doe 20200101 1 M 1
john doe 20200101 M 1
john 20200101 1 M 1
doe 20200101 1 M 1
john doe 20200101 1 1
Karen Doe 20200101 2 F 2
【问题讨论】:
请说明你要实现的逻辑。 虽然是一个很有希望的问题,但您需要告诉我们匹配这些行的具体规则是什么。 任何逻辑都可以 fname、lname、dob、uid 和 gndr 的组合是绝对匹配; uid 和 dob 的组合是匹配的; fname,lname,dob 的组合是匹配的。最后,随意决定哪些其他组合是合适的 您在这里问了基本相同的问题:***.com/questions/61599416/… 在评论中,我解释了为什么这个问题没有意义。这里没有任何意义。假设您有三行 DOB 和性别相同。名称和 SID 是 (John Doe, 1), (Mark Bush, 1), (Mark Bush, 2)。第一行和第三行只有出生日期(和性别)相同;名称和 SID 都不同。但是有 another 行将它们连接到相同的 NEW_ID。这没有多大意义。 【参考方案1】:这就是我想出的。对更好的解决方案持开放态度。谢谢
with HAVE_tmp as
(
select t.*,rownum as seq from HAVE t
)
,TBL1 as
(
SELECT
seq
, DOB
, SID
,first_value(FNAME ignore NULLS) over (partition by SID,DOB order by DOB) as fname
,first_value(LNAME ignore NULLS) over (partition by SID,DOB order by DOB) as lname
,first_value(GNDR ignore NULLS) over (partition by SID,DOB order by DOB) as GNDR
FROM HAVE_tmp
where trim(SID) is not null and trim(DOB) is not null
)
,TBL2 as
(
select t2.*,
first_value(SID ignore NULLS) over (partition by fname,lname order by SEQ) as ID_1
from (
select * from TBL1
union all
select
seq
, DOB
, SID
,FNAME
, LNAME
,GNDR
FROM HAVE_tmp
where trim(SID) is null or trim(DOB) is null
)t2
)
,TBL_FINAL as
(
select t.FNAME,t.LNAME,t.DOB, t.SID,t.GNDR,t1.ID_1 as new_id
from HAVE_tmp t
inner join TBL2 t1 on
t.seq=t1.seq
)
select * from TBL_FINAL
【讨论】:
以上是关于匹配多个字段或字段的任意组合的主要内容,如果未能解决你的问题,请参考以下文章