2017-04-26 24 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語句,非常感謝你 –