2017-04-26 11 views
0

が、私はテーブルアドレスを持っているキーワードの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つだけのアドレスを持っているだろうが、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つのセカンダリアドレスまたは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

私は私が近くにいることを知っていました、私はちょうど注文書と組み合わせることができないと確信していた、ありがとう –

関連する問題