繁体   English   中英

REDSHIFT:SIZE 低于 65K 但“错误:结果大小超过 LISTAGG 限制代码:8001”

[英]REDSHIFT : SIZE below 65K BUT "error: Result size exceeds LISTAGG limit code: 8001"

Redhisft listagg DISTINCT function 上是否有可能存在错误?

当我尝试这个

select 
case when   partition_field IS NOT NULL  THEN regexp_count(
          listaggdistinct(trim(counted_field), ',')  over (partition by partition_field ), 
        ','
        ) + 1 END AS counted_distinct
from 
TABLE

我收到消息错误:结果大小超出 LISTAGG 限制代码:8001

但是我正在连接一个最大长度为 18 的 varchar 字段,此查询验证了该字段

select max(length(counted_field)) from TABLE

如果我运行以下命令,我会得到 10...

select max(COUNTER) from 
    (SELECT  case when   partition_field IS NOT NULL THEN
         count(  counted_field) over (partition by partition_field )
       END as COUNTER
        from TABLE
       )x

所以 10*18... 比 65K 小很多!!!

我究竟做错了什么?

请注意,我与此代码 100% 与 Redshift 文档一致的结果完全相同

select 
case when   partition_field IS NOT NULL  THEN regexp_count(
          listagg( distinct counted_field, ',')  within group (order by counted_field) over (partition by partition_field ), 
        ','
        ) + 1 END AS counted_distinct
from 
TABLE

在此代码中within group (order by contact_id)只是因为否则Redshift会返回WINDOW错误

答案是 partition_field 可以是 null 并且为了避免计算 partition_field NULL 代码必须如下:

select 
case  regexp_count(
          listaggdistinct ( 
              CASE WHEN   partition_field IS NOT NULL  
              THEN counted_field END , ','
                         )  over (partition by partition_field ), 
        ','
        ) + 1 END AS counted_distinct
from 
TABLE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM