在我们的oracle 12c数据库中,我有一个表地址
架构:
Integer personId as PK
String source (what the source data from)
String address1
String address2
String post code
etc...
行的示例:
p1, news paper(Primary), add1, add2, ....
p1, google (Primary), add1, add2, ....
p1, phone (Secondary), add1, add2, ....
p2 new paper (Primary), add1, add2......
p3 phone (Secondary), add1, add2.....
问题: 我需要每个人都有一个独特的地址。虽然大多数人只有1个地址,但有些人最终会有2个或更多地址
目前的解决方案:
select * from (
select person_id, source,row_number() over(partition by person_id order by source) rn from address
)a
where a.rn = 1
查询按源的字母顺序对重复项进行排序,并删除了重复的
然而,我不能简单地按字母顺序排序,因为任何来源包含(主要)优先于任何其他来源,也不保证每个人只有1个主要地址,它可能有两个次要地址或2个主要地址,但在大多数情况下,它将具有主要和次要
答案 0 :(得分:2)
继续你开始的方式。到目前为止,您只按来源排序(即订购)。你想要另一个排名(即订单)?然后应用它。 E.g:
select *
from
(
select
person_id,
source,
row_number() over(
partition by person_id
order by case when source like '%(Primary)%' then 1 else 2 end, source) as rn
from address
) a
where a.rn = 1;