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 函数的替代方法的主要内容,如果未能解决你的问题,请参考以下文章