我在oracle中有两个表。我需要在多个列上找到重复项。它不应将空值视为其中任何一个重复。我想要实现的结果是在一行中找到一个结果,这样我就将第一个用户作为ExistingUser asn的每条与之匹配的记录都按Name,Phone或Adressing作为MatchingUsers列进行匹配。
我有一个NAME = MAX ZANEO的用户,他的Phone = 123和ADDRESS = SesameStreet。然后按ID排序,表中又有两个用户,NAME = NODD A,电话= 123,ADDRESS =华尔街。 NAME = NODD B,他的Phone = 345,ADDRESS = SesameStreet。然后,我想要以如下方式提供数据的方式(粗体为列标题,斜体为列数据): ExistingUser = MAX ZANEO , MatchingUsers = NODD A,NODD B , MatchingData = 电话,地址。
下面是对数据源的查询。
select
up.ID
, ( up.FirstName || ' ' || up.LastName ) as FullName
, up.Phone
, up.Email
, uph.Address
From
UserProfile up
Left Join
UserProfileHistory uph
on up.ID = uph.UserProfileId
Order by up.Created
答案 0 :(得分:1)
由于ID和电话号码在数据中是唯一的,因此请使用自我联接,然后可以将它们的总和用作唯一值。两者总和完全相同的行将相似且重复。
a.Id + b.Id + TO_NUMBER(regexp_replace(a.Phone, '[^[:digit:]]', '')) + TO_NUMBER(regexp_replace(b.Phone, '[^[:digit:]]', '')) as UniqueSum
然后在临时表中使用此结果,并像这样计算行号
row_number() over(partition by UniqueSum order by Created ) as RowNumber
然后选择最上面的行,例如:
where RowNumber = 1