SQL Server 如何在STRING_AGG中获取唯一值并保留排序和NULL处理逻辑
解决方案
要实现STRING_AGG返回唯一值,同时保留原有的排序规则、NULL值转<missing>的逻辑,只需要在聚合操作前先对目标字段去重即可,调整后的CROSS APPLY部分代码如下:
CROSS APPLY ( SELECT attributeOne = STRING_AGG(ISNULL(attributeOne, '<missing>'), ', ') WITHIN GROUP (ORDER BY attributeOne) FROM ( -- 内层先对当前分组的attributeOne去重 SELECT DISTINCT d.attributeOne FROM #bridge b JOIN #dim2 d ON d.dim2key = b.dim2key WHERE b.groupKey = #fact1.groupKey ) AS distinct_attr ) #dim2
逻辑说明
- 内层嵌套查询先筛选出当前
groupKey关联的所有attributeOne,通过DISTINCT完成去重,保留原始NULL值 - 外层对去重后的结果执行原有逻辑:先把NULL替换为
<missing>,再按attributeOne排序后聚合,完全保留原有的业务规则
如果需要保留groupKey为NULL的记录,只需把CROSS APPLY替换为OUTER APPLY即可,外层的ISNULL会自动将聚合结果为NULL的情况替换为<missing>。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

