SQL技术需求:按Project分组并对Detail、Supervisor列去重拼接
解决按Project分组并拼接去重字段的问题
嘿,我明白你的困扰了——要按Project分组,同时把Detail和Supervisor的去重值拼接起来,直接用LISTAGG的时候总因为分组逻辑卡壳对吧?别担心,这里有两种靠谱的解决方案,你可以根据实际需求选择:
方案1:直接在LISTAGG中使用DISTINCT(Oracle 12c+适用)
如果你的需求是分别对Detail和Supervisor字段单独去重(比如同一个Project下,不管Detail对应哪个Supervisor,只要Detail重复就只保留一次),Oracle 12c及以后的版本支持在LISTAGG里直接加DISTINCT关键字,不用额外子查询就能搞定:
SELECT Project, -- 拼接去重后的Detail,用逗号分隔,按Detail排序 LISTAGG(DISTINCT Detail, ', ') WITHIN GROUP (ORDER BY Detail) AS Unique_Details, -- 拼接去重后的Supervisor,同理 LISTAGG(DISTINCT Supervisor, ', ') WITHIN GROUP (ORDER BY Supervisor) AS Unique_Supervisors FROM your_table_name -- 替换成你的实际表名 GROUP BY Project;
方案2:先子查询去重组合,再拼接
如果你的需求是去重Detail和Supervisor的组合对(比如同一个Project下,只有当Detail和Supervisor都重复时才去重,保留不同的配对关系),那先通过子查询筛选出唯一的(Project, Detail, Supervisor)组合,再进行分组拼接:
SELECT Project, LISTAGG(Detail, ', ') WITHIN GROUP (ORDER BY Detail) AS Unique_Detail_Supervisor_Pairs, -- 如果需要单独拼接Supervisor,也可以在这里添加对应逻辑 LISTAGG(Supervisor, ', ') WITHIN GROUP (ORDER BY Supervisor) AS Unique_Supervisors FROM ( -- 先获取所有唯一的Project、Detail、Supervisor组合 SELECT DISTINCT Project, Detail, Supervisor FROM your_table_name -- 替换成你的实际表名 ) deduplicated_data GROUP BY Project;
额外提示
- 记得把代码里的
your_table_name替换成你实际使用的表名; - 可以自由调整分隔符(比如把
,换成;)和排序字段,匹配你的输出需求; - 如果是其他数据库(比如PostgreSQL用
STRING_AGG、MySQL用GROUP_CONCAT),核心逻辑一致,只是函数名不同——比如PostgreSQL可以用STRING_AGG(DISTINCT Detail, ', ') ORDER BY Detail实现类似效果。
内容的提问来源于stack exchange,提问作者palkodi
相关产品推荐
相关产品推荐

