Как обрезать LISTAGG () в Redshift, чтобы предотвратить переполнение - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно объединить строку из нескольких строк в Redshift.

Я использую LISTAGG (), который отлично работает, пока объединенная строка не достигнет предела: Amazon Недопустимая операция: размер результата превышает предел LISTAGG Подробности:

SELECT        LISTAGG(string,',') WITHIN GROUP (ORDER BY string DESC) OVER (PARTITION BY name) AS string_list

1 Ответ

0 голосов
/ 19 июня 2020

Эта проблема возникает всякий раз, когда вы превышаете размер строки (varchar) 65535 байт на Redshift, который является максимальным. Ссылка - AWS ДОКУМЕНТАЦИЯ enter image description here Создание еще одного слоя над ним при использовании SUBSTRING() сделает необходимое.

Предположим, у меня есть эти данные -

enter image description here

Итак, теперь, когда я запускаю запрос -

select distinct listagg(hint,',') WITHIN group (order by id desc) over (PARTITION by Name ) as all_hints from dev.gp_test20200619;

, я получаю следующий результат -

enter image description here

т.е. длина -> 20

Теперь предположим, что я хочу, чтобы длина не превышала 16, тогда -

QUERY -

    SELECT SUBSTRING(all_hints,1,16), length(all_hints) as orignal_length, length(SUBSTRING(all_hints,1,16)) as new_length_using_substring
FROM (SELECT DISTINCT listagg(hint,',') WITHIN GROUP(ORDER BY id DESC) OVER (PARTITION BY Name) AS all_hints
      FROM dev.gp_test20200619)

Ваш результат -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...