首页 > 解决方案 > Amazon Redshift 中 LISTAGG 函数的替代方法

问题描述

我使用 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.

标签: amazon-redshiftstring-aggregation

解决方案


显示您正在运行的查询(或其关键部分)会很有帮助,但我想我可以建议一个方向。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() 使用。


推荐阅读