2017-02-22 10 views
0

ソースから一部の行を削除する要求があります。 このソースは3列が含まれています:ID、タイプ、値などいくつかのデータをcontaines:Informatica Cloud:条件付き複製を削除する

Id Type Value 
1  Master This is the first value 
1  Second This is a new value 
1  Third This is not a mandatory value 
2  Master Another one 
2  Third And again 
3  Second A new hope 
3  Third A third 
4  Second A single value 
... 

は、行を維持するためのルールは次のとおりです。

1つのIDのための単一の行には、既存の値

を取得した場合エルス

: 同じIDと「マスター」のための複数の行は、「マスター」の値を取得存在する場合

同じIDと「マスター」ではない存在とのための複数の行は、「第2」、「第二」を取得存在する場合値

同じIDと 'Master'の複数の行が存在せず、 'Second'が存在せず、 'Third'が存在する場合は、 'Third'値を取得します。私のサンプルで

ので、私だけを抽出したいと思います:

Id Type Value 
1 Master This is the first value 
2 Master Another one 
3 Second A new hope 
4 Second A single value 

私は3つの異なるソースに分割され、参加したり検索してみてください、しかし、重複する行を破棄するように任意のパラメータが見つかりません。

どうすればいいですか?事前に

おかげで、 BR ザビエル

答えて

0

幸運マスターは、第二の前に来る(あなたの要件に応じて、DESCを、次に入力し、最後にIDのASCによってaggregaterのグループ化によるIDで注文するソーターを介してそれらを置くてみましたアルファベット順に3番目に来る)

+0

こんにちは、私の最初の解決策よりも簡単です。私のようなデータで作業している場合は、事前に感謝します。よろしくご連絡ください – Cascador84

+0

そして、あなたは他の並べ替えが必要な場合は、式を使用していくつかの整数に変換して並べ替えることができます。例えば。 DECODE(タイプ、 'Master'、3、 'Third'、2、 'Second'、1)はMasterを選択します。 – Maciejg

+0

こんにちは、ありがとうございます、それは今、最後までagg分を変更するときに動作します:) – Cascador84

0

informaticaマップに変換することができるクエリを見つけてください。

create table test1 
(id integer, 
    type varchar2(100), 
    value varchar2(1000) 
); 

insert into test1 values (1,'Master','This is the first value'); 
insert into test1 values (1,'Second','This is a new value'); 
insert into test1 values (1,'Third','This is not a mandatory value'); 
insert into test1 values (2,'Master','This is the first value'); 
insert into test1 values (2,'Third','This is not a mandatory value'); 
insert into test1 values (3,'Second','This is the first value'); 
insert into test1 values (3,'Third','This is not a mandatory value'); 
insert into test1 values (4,'Second','mandatory value'); 
commit; 

select * from test1;  

From the below query "agg" part can be done in aggregator and decode function within aggregator transformation. 

Then use joiner to join agg part and actual table 

use filter to filter the required rows 

    with agg as 
    (select  max(case when type='Master' then 10 
       when type='Second' then 9 
       when type='Third' then 8 
       else 7 end) ms, 

      id 
     from test1 
    group by id 

) 
    select a.ms,b.* from agg a, test1 b 
     where a.id=b.id 
     and case when a.ms=10 then 'Master' 
       when a.ms=9 then 'Second' 
        when a.ms=8 then 'Third' 
        else 'noval2' 
        end =b.type; 
関連する問題