Объединить поле из нескольких строк в одно поле

Барьеры: я не могу ничего создать. Нет 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
Другие вопросы по тегам