совпадение по нескольким или любой комбинации полей - PullRequest
0 голосов
/ 07 мая 2020

У меня есть эта таблица «HAVE», и мне нужны результаты в таблице WANT

HAVE

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

1 Ответ

0 голосов
/ 07 мая 2020

Это то, что я придумал. Открыт для лучших решений. Спасибо

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...