Amazon Redshift 中 LISTAGG 函数的替代方法

Posted

技术标签:

【中文标题】Amazon Redshift 中 LISTAGG 函数的替代方法【英文标题】:Alternate to LISTAGG function in Amazon Redshift 【发布时间】:2020-11-04 13:40:31 【问题描述】:

我使用 LISTAGG 函数将行值转换为一列,但遇到以下错误。搜索时,当结果行超过 65535 [https://docs.aws.amazon.com/redshift/latest/dg/r_LISTAGG.html]。我的结果集更多 100000 所以我得到了下面的异常。这个功能的替代品是什么?如何在 redshift 中实现我的用例。请帮忙。

 -----------------------------------------------
  error:  Result size exceeds LISTAGG limit
  code:      8001
  context:   LISTAGG limit: 65535
  process:   query18_863_20899937 [pid=66066]```


**My Use Case**
From:

ID     dates
00     date00
01     date00
00     date01
00     date02
00     date03
01     date01


**To: [Using LISTAGG function]**
ID   dates
00   date00,date01,date02,date03
01   date00,date01

Thanks.

【问题讨论】:

我能够解决这个问题。问题不在于行数超过 65535 时,而是它尝试聚合的列的 varchar 大小超过 65535 【参考方案1】:

显示您正在运行的查询(或其关键部分)会很有帮助,但我想我可以建议一个方向。 LISTAGG() 有一个“WITHIN GROUP”选项,并记录在您在帖子中提到的链接中。

组内的Listagg() 将仅为“GROUP BY”子句中定义的组中的值聚合文本列。因此,为了满足您想要的输出,您应该能够执行以下操作:

select ID, listagg(dates) within group as dates
from <table>
group by ID;

将存在相同的 listagg() 限制 - 只是现在它应用于每个“分组依据”组。如果这仍然会产生一个太长的文本字符串,您将需要将内容分成更多组。发生这种情况时,我将计算一个“子部分”列,该列在组中每 1,000 行递增一次。这样我可以确保没有任何组会产生超过 1,000 行供 listagg() 使用。

【讨论】:

感谢比尔·韦纳。我使用了与上面相同的查询。

以上是关于Amazon Redshift 中 LISTAGG 函数的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

Listagg Redshift DDL

使用 redshift listagg 函数的语法错误

Redshift SQL - 反向 Listagg 函数

Amazon EMR 与 Amazon Redshift

如何从我的 Amazon EC2 实例中连接到 Amazon Redshift 集群

不使用 jdbc 驱动程序查询 Amazon Redshift