匹配多个或任何字段组合

问题描述 投票:0回答:1

我有此表“ 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可以是行数或uid)

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

sql oracle oracle10g
1个回答
0
投票

这是我想出的。开放寻求更好的解决方案。谢谢

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
© www.soinside.com 2019 - 2024. All rights reserved.