Как функцией LISTAGG вернуть значения без повторений?
Пробую воспользоваться функцией LISTAGG. Надо получить значения колоннки без повторений.
Возможно ли это без создания дополнительных функций?
with data (col1, col2, creator) as (
select 1, 2, 'Smith' from dual union all
select 1, 2, 'John' from dual union all
select 1, 3, 'Ajay' from dual union all
select 1, 4, 'Ram' from dual union all
select 1, 5, 'Jack' from dual
)
select '['||listagg (col2, ',') within group (order by col2)||']' res
from data
Нужно получить колонку col1 и список из колонки col2 функцией LISTAGG.
Получаю [2,2,3,4,5], а желаемый результат [2,3,4,5].
Ответы (2 шт):
Автор решения: 0xdb
→ Ссылка
select listagg (col, ',') within group (order by col)
from (
select distinct col2 col
from data
) t
Если нужно больше колонок, то нечто такое будет решением:
select col1, listagg (col2, ',') within group (order by col2)
from (
select col1, col2, row_number () over (partition by col1, col2 order by col1) as rn
from data
order by col1, col2
)
where rn = 1
group by col1;
Источник: @a_horse_with_no_name
Автор решения: 0xdb
→ Ссылка
В актуальной версии Oracle 19c в LISTAGG добавлена опция DISTINCT.
DISTINCT Option for LISTAGG Aggregate
The
LISTAGGaggregate function now supports duplicate elimination by using the newDISTINCTkeyword.
select col1, listagg (distinct col2, ',') within group (order by col2) res
from data
group by col1;
Даст желаемый результат:
COL1 RES
---------- ----------
1 2,3,4,5