На первом этапе объедините столбцы compN
в указанном порядке.
Вы будете использовать LISTAGG
- обратите внимание, что вы используете функции разделитель и NVL
, чтобы сделать результат уникальным - вы не хотите интерпретировать (A, A, ноль, ноль) как дубликат (AA, нуль, ноль, ноль)
with t1 as (
select id, nvl(comp1,'-') comp from test union all
select id, nvl(comp2,'-') comp from test union all
select id, nvl(comp3,'-') comp from test union all
select id, nvl(comp4,'-') comp from test)
select id,
listagg(comp,',') within group (order by comp) as comp_key
from t1
group by id
order by 2
;
ID COMP_KEY
---------- --------
3 -,A,B,C
1 -,A,B,C
4 -,D,E,F
2 -,D,E,F
Остальное так же просто, как группировать на COMP_KEY
и выбрать строку из вашего источника.
Вот пример выбора самого высокого значения ID
для группы (см. max(id)
в t3
подзапросе).
with t1 as (
select id, nvl(comp1,'-') comp from test union all
select id, nvl(comp2,'-') comp from test union all
select id, nvl(comp3,'-') comp from test union all
select id, nvl(comp4,'-') comp from test),
t2 as (
select id,
listagg(comp,',') within group (order by comp) as comp_key
from t1
group by id
), t3 as (
select comp_key, max(id) id from t2
group by comp_key)
select * from test
where id in (select id from t3)
order by id
;
.
ID LOC_ID ORG_ID COMP1 COMP2 COMP3 COMP4 PAPER_ID
---------- ---------- ---------- ----- ----- ----- ---------- ----------
3 5 4 C B A 1
4 6 3 E F D 1