在SQL Server中使用STRING_AGG获取唯一值的实现方案
解决SQL Server中STRING_AGG聚合重复值的问题
问题背景
你当前的查询通过STRING_SPLIT拆分bID字段后得到了包含重复值的结果,直接使用STRING_AGG聚合会保留这些重复项,但你需要每个ProjectID对应的唯一值拼接结果。
解决方案:先去重再聚合
核心思路是先对拆分后的value按ProjectID去重,再执行STRING_AGG聚合操作。这里提供两种可行的写法:
方法一:用子查询+DISTINCT先去重
SELECT ProjectID, STRING_AGG(newID.value, ', ') WITHIN GROUP (ORDER BY newID.value) AS NewField FROM ( SELECT DISTINCT ProjectID, newID.value FROM [dbo].[Data] WITH(NOLOCK) CROSS APPLY STRING_SPLIT([bID], ';') AS newID WHERE newID.value IN ('O95833', 'Q96NY7-2') ) AS temp GROUP BY ProjectID ORDER BY ProjectID;
方法二:GROUP BY同时按ProjectID和value去重
SELECT ProjectID, STRING_AGG(value, ', ') WITHIN GROUP (ORDER BY value) AS NewField FROM [dbo].[Data] WITH(NOLOCK) CROSS APPLY STRING_SPLIT([bID], ';') AS newID WHERE newID.value IN ('O95833', 'Q96NY7-2') GROUP BY ProjectID, newID.value ORDER BY ProjectID;
预期结果
执行上述任一查询后,会得到你想要的无重复聚合结果:
ProjectID NewField ------------------------------- 2 O95833, Q96NY7-2 4 Q96NY7-2
原查询问题分析
原来的查询直接对拆分后的所有重复值进行聚合,没有先过滤重复项。通过先对ProjectID和value做去重处理(无论是DISTINCT还是GROUP BY),确保每个ProjectID下的每个value只出现一次,再聚合就能得到唯一值拼接的结果。
内容的提问来源于stack exchange,提问作者gkoul
相关产品推荐
相关产品推荐

