Несколько строк в One Teradata

Моя изменчивая таблица в Teradata содержит данные, подобные следующим.

  ID |  RECORD_TIMESTAMP |  CHANNEL
1    |    20200101       |  A
1    |    20200102       |  B
1    |    20200103       |  C
2    |    20200104       |  D
3    |    20200105       |  E 

Мой требуемый результат - объединить данные на основе идентификатора и разграничить с помощью канала. Идентификатор может иметь или не иметь несколько экземпляров (несколько экземпляров до 50 для каждого идентификатора).

Необходимый вывод:

1|20200101|A|1|20200102|B|1|20200103|C
2|20200104|D
3|20200105|E

Как мы можем этого добиться? Я попробовал самосоединение, которое создавало дубликаты, попробовал XMLAGG, но не смог воспроизвести нужный мне формат.


person Devi    schedule 05.02.2020    source источник


Ответы (1)


Как насчет такого:

SELECT ID, 
  TRIM(TRAILING '|' FROM (
    XMLAGG(
      ID || '|' || RECORD_TIMESTAMP || '|' || CHANNEL || '|' -- value to group
      ORDER BY ID, RECORD_TIMESTAMP, CHANNEL -- group ordering
    ) 
    (VARCHAR(1000))
    )
  ) AS MyRecordGroups
FROM MyTable
GROUP BY ID
;
person ravioli    schedule 05.02.2020
comment
Большое спасибо, это сработало для небольшого объема данных в таблице. В реальной таблице было 77 миллионов записей. И это не удалось с ошибкой: 3156, запрос прерван TDWM. Критерии исключения: процессорное время. Есть ли обходной путь без обращения за помощью к администратору баз данных? - person Devi; 05.02.2020
comment
Без проблем. Хм... лучше всего было бы сделать GROUP BY с помощью индексированного поля в вашей таблице -- является ли ID первичным индексом? Если нет, можете ли вы добавить вторичный индекс и собирать по нему статистику? Кроме того, попробуйте запустить EXPLAIN для запроса, чтобы увидеть, какой шаг может вызвать проблему. - person ravioli; 05.02.2020