2017-02-22 49 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 
... 

Правило держать ряд является:

Если одна строка за один Id, получить существующее значение

Else: Если несколько строк для той же Id и «Master» существует, получить значение «Мастера»

Если несколько строк для той же Id и «Master» не существует и «Второй» существует, получить «второй» значение

Если несколько строк для того же ИД и «Мастер» не существуют, а «Второе» не существует и «Третий» существует, получите значение «Третье».

В моем примере это так, я хотел бы извлечь только:

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 Xavier

ответ

0

Попробуйте поставить их через сортировщик на заказ по идентификатору затем тип и, наконец, через Aggregater группировки по ID возрастанию, DESC в зависимости от ваших требований (удачливый мастер предшествует второй, который до третьего по алфавиту)

+0

Привет, ваше право, я попробую сделать это проще, чем мое первое решение. спасибо заранее, я обращаюсь к вам за работой с моими данными. С уважением – Cascador84

+0

И если вам нужен какой-то другой вид, вы можете использовать выражение, чтобы преобразовать его в некоторые целые числа, а затем отсортировать. Например. DECODE (Тип, «Мастер», 3, «Третий», 2, «Второй», 1) выбирают «Второй», затем «Третий», затем «Мастер». – Maciejg

+0

Привет, спасибо всем, теперь он работает при изменении agg min до последнего :) – Cascador84

0

Пожалуйста, найдите запрос, который может быть преобразован на информационную карту.

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;