2017-04-26 34 views
0

在Oracle 12c中的数据库,我有一个表的地址Oracle订单或等级由字符串关键字

架构:行

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 

查询以便通过源的字母顺序重复,并删除了其中的一个副本

但是我不能仅仅按照字母顺序排列它,因为任何源包含(主要)优先于任何其他来源,每个人也不能保证只有一个主要地址,它可能有两个辅助地址或2个主地址,但在大多数情况下它会有一个主地址和一个辅助

+0

您需要编写一些业务规则并测试它们的有效性。看起来您没有足够的信息来达成一些明确的业务规则,而无需对外部数据集进行验证。来源:我建立这样做的系统。 – Ben

+0

@ben你位于布里斯托尔吗? –

+0

不,我不是...... – Ben

回答

2

只要继续你开始的方式。到目前为止,您只能按来源排列(即排序)。你想要另一个排名(即订单)?然后应用它。例如:

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; 
+0

我知道我很接近,我只是不知道顺序可以结合case语句,非常感谢你 –