дублирование записей в функции listagg

77
8

У меня есть таблица, в которой два поля являются id, controlflag.It выглядит

Id    CntrlFlag       
121 SSSSSRNNNSSRSSNNR
122 SSSNNRRSSNNRSSSSS
123 RRSSSNNSSSSSSSSSSSSSSS

Я должен получить вывод в следующем виде (вхождения R)

Id    Flag
121 6,12,17
122 6,7,12
123 1,2

Я пробовал запрос оракула (как я получил с этого форума):

select  mtr_id,listagg(str,',') within group (order by lvl) as flags from
( select mtr_id, instr(mtr_ctrl_flags,'R', 1, level) as str, level as lvl
from mer_trans_reject
connect by level <= regexp_count(mtr_ctrl_flags, 'R'))group by mtr_id;

он дает результат, но 2-е и 3-е вхождения (не первое) дублируются a нет. раз. это выглядит как

id   Flag
123 6,12,12,12,12,17,17,17,17,17.

Может ли кто-нибудь узнать, что здесь не так?

спросил(а) 2021-01-25T16:44:25+03:00 5 месяцев назад
1
Решение
76

Этого можно избежать, выбрав отдельное ключевое слово. Есть ли другой способ?

Да, есть, но это немного тяжелее (разница будет вам меньше):

with t1(Id1, CntrlFlag) as(
select 121, 'SSSSSRNNNSSRSSNNR' from dual union all
select 122, 'SSSNNRRSSNNRSSSSS' from dual union all
select 123, 'RRSSSNNSSSSSSSSSSSSSSS' from dual
)
select w.id1
, listagg(w.r_pos, ',') within group(order by w.id1) as R_Positions
from (select q.id1
, regexp_instr(q.CntrlFlag,'R', 1, t.rn) as r_pos
from t1 q
cross join (select rownum rn
from(select max (regexp_count(CntrlFlag, 'R')) ml
from t1
)
connect by level <= ml
) t
) w
where w.r_pos > 0
group by w.id1

Результат:

 ID1        R_POSITIONS
---------- -----------
121 12,17,6
122 12,6,7
123 1,2

ответил(а) 2021-01-25T16:44:25+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема