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

Teradata中基于FLAG条件分组拼接discountCode的实现问题

Teradata按userId分组拼接discountCode的条件实现方案

需求说明

按userId分组拼接discountCode列,需遵循以下FLAG规则:

  • 当用户所有FLAG为0时,拼接全部discountCode
  • 当用户存在0与非0混合FLAG时,仅拼接FLAG非0的discountCode
  • 当用户所有FLAG均非0时,拼接全部discountCode

示例数据

userIddiscountCodeFLAG
abo1remise 11
abo1Remise 22
abo1remise 100%0
abo1remise 16%0
abo2remise 10
abo2Remise 20
abo2remise 100%0
abo2remise 16%0

预期结果

userIddiscountCode
abo1remise 1 | Remise 2
abo2remise 1 | Remise 2 | remise 100% | remise 16%

实现SQL

SELECT 
    userId,
    -- 拼接后去除末尾多余的分隔符
    TRIM(TRAILING ' | ' FROM XMLAGG(TRIM(discountCode) || ' | ' ORDER BY discountCode) (VARCHAR(1000))) AS discountCode
FROM (
    SELECT 
        userId,
        discountCode,
        FLAG,
        -- 按userId标记FLAG分布类型
        CASE 
            WHEN MIN(FLAG) OVER(PARTITION BY userId) = 0 AND MAX(FLAG) OVER(PARTITION BY userId) = 0 THEN 0 -- 全0
            WHEN MIN(FLAG) OVER(PARTITION BY userId) = 0 AND MAX(FLAG) OVER(PARTITION BY userId) > 0 THEN 1 -- 混合
            ELSE 2 -- 全非0
        END AS flag_type
    FROM your_table_name -- 替换为实际表名
) t
WHERE 
    -- 根据FLAG类型过滤需拼接的记录
    flag_type = 0 
    OR (flag_type = 1 AND FLAG > 0)
    OR flag_type = 2
GROUP BY userId;

逻辑说明

  1. 子查询通过窗口函数MIN(FLAG)和MAX(FLAG)按userId分组,判断每个用户的FLAG分布类型
  2. 外层查询根据FLAG类型过滤记录:
    • 类型0(全0):保留所有记录
    • 类型1(混合):仅保留FLAG>0的记录
    • 类型2(全非0):保留所有记录
  3. 使用XMLAGG对过滤后的discountCode进行拼接,并用TRIM去除末尾多余的分隔符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:52:30