【发布时间】:2016-06-27 06:58:23
【问题描述】:
使用这篇文章中的示例: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 中重新创建此结果以避免任何数据丢失并考虑速度的最佳方法是什么?
【问题讨论】:
-
我想建议对 Hyruma92 的解决方案进行修改。因为有些字符超过 1 个字节,所以最好使用返回字节数的OCTET_LENGTH,而不是返回字符数的 LENGTH。