【问题标题】:How to truncate LISTAGG() in Redshift to prevent overflow如何在 Redshift 中截断 LISTAGG() 以防止溢出
【发布时间】:2020-06-18 02:32:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: amazon-redshift


    【解决方案1】:

    每当您在 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)
    

    你的结果 -

    【讨论】:

    • 您是否真的用足够大的数据集测试了这个查询,以超过 Redshift 的 65,535 限制?它不适合我。
    • 这不起作用,因为它无论如何都在创建 listagg 然后截断它。问题是,如何创建一个已经被截断的 listagg 以避免溢出。
    • 我已经思考了几个星期@SergioPolimante 并没有找到红移的答案。 Oracle 有一个 listagg 的“溢出”参数,在 redshift 中没有类似的
    猜你喜欢
    • 2016-06-27
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    相关资源
    最近更新 更多