gpt4 book ai didi

amazon-redshift - 在 Amazon Redshift 上管理 LISTAGG 中的溢出

转载 作者:行者123 更新时间:2023-12-03 17:29:17 25 4
gpt4 key购买 nike

使用这篇文章中的例子:https://blogs.oracle.com/datawarehousing/entry/managing_overflows_in_listagg

以下声明:

SELECT
deptno,
LISTAGG(ename, ';') WITHIN GROUP (ORDER BY empno) AS namelist
FROM emp
GROUP BY deptno;

将生成以下输出:
DEPTNO     NAMELIST
---------- ----------------------------------------
10 CLARK;KING;MILLER
20 SMITH;JONES;SCOTT;ADAMS;FORD
30 ALLEN;WARD;MARTIN;BLAKE;TURNER;JAMES

假设上面的语句没有运行,并且我们的 LISTAGG 函数中的每一行都可以返回 15 个字符的限制。这实际上是 Amazon Redshift 上的 65535。

在这种情况下,我们希望返回以下内容:
DEPTNO     NAMELIST
---------- ----------------------------------------
10 CLARK;KING
10 MILLER
20 SMITH;JONES
20 SCOTT;ADAMS
20 FORD
30 ALLEN;WARD
30 MARTIN;BLAKE
30 TURNER;JAMES

在 Amazon Redshift 中重新创建此结果以避免任何数据丢失并考虑速度的最佳方法是什么?

最佳答案

可以使用 2 个子查询来实现这一点:
第一的:

SELECT id, field,
sum(length(field) + 1) over
(partition by id order by RANDOM() rows unbounded preceding) as total_length_now
from my_schema.my_table)
最初,我们想计算表中每个 id 的字符数。我们可以使用窗口函数为每一行增量计算它。在“order by”语句中,您可以使用您拥有的任何唯一字段。如果你没有,你可以简单地使用随机或散列函数,但必须保证该字段是唯一的,否则,该函数将无法正常工作。
长度中的“+1”代表我们将在 listagg 函数中使用的分号。
第二:
SELECT id, field, total_length_now / 65535 as sub_id
FROM (sub_query_1)
现在我们根据之前计算的长度创建一个 sub_id。如果 total_length_now 超过限制大小(在本例中为 65535),则除法的其余部分将返回一个新的 sub_id。
最后一步
SELECT id, sub_id, listagg(field, ';') as namelist
FROM (sub_query_2)
GROUP BY id, sub_id
ORDER BY id, sub_id
现在我们可以简单地调用 listagg 函数按 id 和 sub_id 分组,因为每个组不能超过大小限制。
完整查询
SELECT id, sub_id, listagg(field, ';') as namelist
FROM (
SELECT id, field, total_length_now / 65535 as sub_id
FROM (SELECT id,
field,
sum(length(field) + 1) over
(partition by id order by field rows unbounded preceding) as total_length_now
from support.test))
GROUP BY id, sub_id
order by id, sub_id
您的数据示例(大小限制 = 10)
第一个和第二个查询输出:
id, field, total_length_now, sub_id

10,KING,5,0
10,CLARK,11,1
10,MILLER,18,1
20,ADAMS,6,0
20,SMITH,12,1
20,JONES,18,1
20,FORD,23,2
20,SCOTT,29,2
30,JAMES,6,0
30,BLAKE,12,1
30,WARD,17,1
30,MARTIN,24,2
30,TURNER,31,3
30,ALLEN,37,3
最终查询输出:
id,sub_id,namelist

10,0,KING
10,1,CLARK;MILLER
20,0,ADAMS
20,1,SMITH;JONES
20,2,FORD;SCOTT
30,0,JAMES
30,1,BLAKE;WARD
30,2,MARTIN
30,3,TURNER;ALLEN

关于amazon-redshift - 在 Amazon Redshift 上管理 LISTAGG 中的溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35950254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com