按字符串关键字

时间:2017-04-26 14:53:34

标签: sql oracle

在我们的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个主要地址,但在大多数情况下,它将具有主要和次要

1 个答案:

答案 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;