Netezza无GROUP_CONCAT使用权限的替代实现方案咨询
Netezza无GROUP_CONCAT权限的行转列字符串合并方案
方案1:DX_ORDER取值固定场景的修正写法
原写法问题为高序号DX_ORDER单独存在时,前置分隔符无匹配内容,统一为所有拼接段增加相同前缀后,用LTRIM移除首部分隔符即可解决:
SELECT ID, LTRIM( MAX(CASE WHEN DX_ORDER = 1 THEN '; ' || DX_CODE ELSE '' END) || MAX(CASE WHEN DX_ORDER = 2 THEN '; ' || DX_CODE ELSE '' END) || MAX(CASE WHEN DX_ORDER = 3 THEN '; ' || DX_CODE ELSE '' END) -- 按实际业务中DX_ORDER的最大取值补全CASE分支 , '; ') AS DX_CODES FROM 业务表 DX GROUP BY ID
该方案性能最优,适合DX_ORDER最大值固定且数量较少的场景。
方案2:DX_ORDER取值不固定的通用递归方案
如果无法提前枚举所有DX_ORDER的取值,可以用Netezza原生支持的递归CTE实现,无需额外组件权限:
WITH RECURSIVE concat_cte AS ( -- 锚点:取每个ID下排序第一的诊断编码作为初始拼接值 SELECT ID, DX_ORDER, CAST(DX_CODE AS VARCHAR(2000)) AS DX_CODES -- 长度按需调整避免截断 FROM 业务表 t1 WHERE DX_ORDER = (SELECT MIN(DX_ORDER) FROM 业务表 t2 WHERE t2.ID = t1.ID) UNION ALL -- 递归拼接后续排序的诊断编码 SELECT c.ID, t.DX_ORDER, c.DX_CODES || '; ' || t.DX_CODE FROM concat_cte c INNER JOIN 业务表 t ON c.ID = t.ID AND t.DX_ORDER = c.DX_ORDER + 1 ) -- 取每个ID拼接完成的最终结果 SELECT ID, MAX(DX_CODES) AS DX_CODES FROM concat_cte GROUP BY ID
注意事项
- 递归CTE中
DX_CODES字段的VARCHAR长度需要根据单ID下所有DX_CODE的总长度预估调整,避免数据截断 - 若业务中存在DX_ORDER不连续的情况,可以先给每个ID下的记录生成连续的排序序号再做递归拼接
内容的提问来源于stack exchange,提问作者Chris Jones
相关产品推荐
相关产品推荐

