Объединить поле из нескольких строк в одно поле
Барьеры: я не могу ничего создать. Нет GTT, PROC и т. Д. Я запрашиваю озеро данных Exadata, и любой сценарий, который я создаю, будет выполняться из Toad или SQL Developer.
У меня есть запрос SELECT, который возвращает 3 строки:
- Дата
- IdKey
- СОБЫТИЕ
Для каждой даты, IDKey, вероятно, существует около дюжины событий. Пример:
DATE IDKEY EVENT
10/17/2016 300328 EVENT1
10/17/2016 300328 EVENT3
10/17/2016 300328 EVENT4
10/17/2016 300440 EVENT1
10/17/2016 300440 EVENT2
10/17/2016 300440 EVENT5
В заданную ДАТУ IDKey может иметь несколько СОБЫТИЙ, каждое из которых генерирует новую строку.
Цель: создать одну строку, которая группирует DATE и IDKEY, объединяя все уникальные СОБЫТИЯ в одно поле;
DATE IDKEY EVENT
10/17/2016 300328 'EVENT1 | EVENT3 | EVENT4'
10/17/2016 300440 'EVENT1 | EVENT2 | EVENT5'
2 ответа
Решение
Выглядит как group by
с listagg
:
with demo (dt, id, event) as
( select date '2016-10-17', 300328, 'EVENT1' from dual union all
select date '2016-10-17', 300328, 'EVENT3' from dual union all
select date '2016-10-17', 300328, 'EVENT4' from dual union all
select date '2016-10-17', 300440, 'EVENT1' from dual union all
select date '2016-10-17', 300440, 'EVENT2' from dual union all
select date '2016-10-17', 300440, 'EVENT5' from dual
)
select dt, id
, listagg(event, '|') within group (order by event) as events
from demo
group by dt, id;
DT ID EVENTS
----------- ---------- --------------------------------
17/10/2016 300328 EVENT1|EVENT3|EVENT4
17/10/2016 300440 EVENT1|EVENT2|EVENT5
Могут возникнуть проблемы, если существует огромное количество событий.
Вы можете использовать функцию "listagg". Посмотрите на http://docs.oracle.com/database/122/SQLRF/LISTAGG.htm для дальнейшего чтения
select date, id, listagg(event,'|') within group(order by date,id)
from my_table
group by date,id