首页 > 解决方案 > 如何在 Redshift 中截断 LISTAGG() 以防止溢出

问题描述

我需要连接 Redshift 中多行的字符串。

我正在使用 LISTAGG() 在连接字符串达到限制之前效果很好:亚马逊无效操作:结果大小超过 LISTAGG 限制详细信息:

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

标签: amazon-redshift

解决方案


每当您在 Redshift 上超过 65535 字节的字符串(varchar)大小时,就会出现此问题,这是 Max。链接 - AWS DOCUMENTATION 在此处输入图像描述 在使用时在其上方创建另一层SUBSTRING()将是必要的。

假设我有这个数据 -

在此处输入图像描述

所以现在当我运行查询时 -

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

我得到以下结果 -

在此处输入图像描述

即长度是->20

现在假设我希望长度不超过 16,那么 -

询问 -

    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)

你的结果——

在此处输入图像描述


推荐阅读