You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LISTAGG函数聚合时如何排除Acc Nbr Not Enterered值

LISTAGG拼接结果剔除无效占位值实现方案

问题说明

使用LISTAGG函数做分组字符串拼接时,返回结果包含不需要展示的无效账号占位文本,未达到预期输出要求。

原执行SQL

SELECT pid
       ,LISTAGG(DISTINCT acc_no, ',') WITHIN GROUP(ORDER BY acc_no) 
        AS acc_no_txt
FROM
(SELECT pid
      ,CASE WHEN acc_no_v01 IN ('not found','blank','nil-value','',' ','null') THEN 'Acc Nbr Not Enterered'
       ELSE acc_no_v01
       END
       AS acc_no
      ,MIN(TRY_TO_NUMBER(T2.vp_no)) AS vp_no
FROM table_1 T1
JOIN table_2 T2
ON T2.click_stream_integration_id = T1.click_stream_integration_id
WHERE T2.date = '2022-01-01'
AND pid='123456789'
GROUP BY pid,acc_no_v01
ORDER BY TRY_TO_NUMBER(vp_no)
)
GROUP BY pid;

实际运行结果

PID                          ACC_NO_TXT
123456789              12244059141,Acc Nbr Not Enterered

预期输出结果

PID                          ACC_NO_TXT
123456789              12244059141

调整方法

问题原因:内层子查询将无效账号统一转换为固定字符串Acc Nbr Not Enterered,该值会被LISTAGG识别为有效值参与拼接,导致结果不符合预期,可通过以下两种方式调整:

  • 推荐方案:调整内层CASE逻辑,无效值返回NULL
    LISTAGG函数默认自动忽略NULL值,不会将NULL拼入最终结果,修改后SQL如下:

    SELECT pid
           ,LISTAGG(DISTINCT acc_no, ',') WITHIN GROUP(ORDER BY acc_no) 
            AS acc_no_txt
    FROM
    (SELECT pid
          ,CASE WHEN acc_no_v01 IN ('not found','blank','nil-value','',' ','null') THEN NULL -- 无效值返回NULL,不生成占位字符串
           ELSE acc_no_v01
           END
           AS acc_no
          ,MIN(TRY_TO_NUMBER(T2.vp_no)) AS vp_no
    FROM table_1 T1
    JOIN table_2 T2
    ON T2.click_stream_integration_id = T1.click_stream_integration_id
    WHERE T2.date = '2022-01-01'
    AND pid='123456789'
    GROUP BY pid,acc_no_v01
    )
    GROUP BY pid;
    

    子查询中原有的ORDER BY TRY_TO_NUMBER(vp_no)无实际作用,派生表的排序不会被外层分组逻辑继承,可删除减少不必要的计算开销。

  • 兼容方案:外层聚合前过滤无效占位行
    如果业务逻辑需要在内层保留Acc Nbr Not Enterered字段做其他计算,可以在外层执行聚合前增加过滤条件,直接剔除占位值对应的行:

    SELECT pid
           ,LISTAGG(DISTINCT acc_no, ',') WITHIN GROUP(ORDER BY acc_no) 
            AS acc_no_txt
    FROM
    (SELECT pid
          ,CASE WHEN acc_no_v01 IN ('not found','blank','nil-value','',' ','null') THEN 'Acc Nbr Not Enterered'
           ELSE acc_no_v01
           END
           AS acc_no
          ,MIN(TRY_TO_NUMBER(T2.vp_no)) AS vp_no
    FROM table_1 T1
    JOIN table_2 T2
    ON T2.click_stream_integration_id = T1.click_stream_integration_id
    WHERE T2.date = '2022-01-01'
    AND pid='123456789'
    GROUP BY pid,acc_no_v01
    )
    WHERE acc_no != 'Acc Nbr Not Enterered' -- 聚合前过滤掉占位值记录
    GROUP BY pid;
    

内容的提问来源于stack exchange,提问作者Sherin Shaziya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:27:47