Teradata中基于FLAG条件分组拼接discountCode的实现问题
Teradata按userId分组拼接discountCode的条件实现方案
需求说明
按userId分组拼接discountCode列,需遵循以下FLAG规则:
- 当用户所有FLAG为0时,拼接全部
discountCode - 当用户存在0与非0混合FLAG时,仅拼接FLAG非0的
discountCode - 当用户所有FLAG均非0时,拼接全部
discountCode
示例数据
| userId | discountCode | FLAG |
|---|---|---|
| abo1 | remise 1 | 1 |
| abo1 | Remise 2 | 2 |
| abo1 | remise 100% | 0 |
| abo1 | remise 16% | 0 |
| abo2 | remise 1 | 0 |
| abo2 | Remise 2 | 0 |
| abo2 | remise 100% | 0 |
| abo2 | remise 16% | 0 |
预期结果
| userId | discountCode |
|---|---|
| abo1 | remise 1 | Remise 2 |
| abo2 | remise 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;
逻辑说明
- 子查询通过窗口函数
MIN(FLAG)和MAX(FLAG)按userId分组,判断每个用户的FLAG分布类型 - 外层查询根据FLAG类型过滤记录:
- 类型0(全0):保留所有记录
- 类型1(混合):仅保留FLAG>0的记录
- 类型2(全非0):保留所有记录
- 使用
XMLAGG对过滤后的discountCode进行拼接,并用TRIM去除末尾多余的分隔符
内容的提问来源于stack exchange,提问作者jo95
相关产品推荐
相关产品推荐

