如何使用标准SQL将指定数据字段聚合到同一行?
问题分析与解决方案
原查询无法得到预期结果的原因:
- GROUP BY子句错误包含了
Skill字段,导致每个不同的Skill单独成组,完全无法实现同类型Skill的聚合 - 多余使用
DISTINCT(包括SELECT和array_agg中的),会过滤掉需要保留的重复Type值,同时破坏聚合逻辑 - 使用
array_agg会生成数组类型结果,但目标需求是逗号分隔的字符串格式,更适合用string_agg
正确的查询语句
要实现目标结果,需按ID、Quarter、Type分组,对同组的Skill进行字符串聚合:
SELECT ID, Quarter, string_agg(Skill, ', ') AS Skill, string_agg(Type, ', ') AS Type FROM table1 GROUP BY ID, Quarter, Type ORDER BY ID, Quarter, Type
如果确实需要数组类型的结果(而非字符串),可替换为array_agg:
SELECT ID, Quarter, array_agg(Skill) AS Skill, array_agg(Type) AS Type FROM table1 GROUP BY ID, Quarter, Type ORDER BY ID, Quarter, Type
结果说明
执行上述查询后,会得到与目标一致的结果:
- 同一ID、季度、技能类型下的Skill会被逗号分隔聚合
- 不同技能类型会保留为单独行(比如B的Q1中Technical和Soft Skill分为两行)
内容的提问来源于stack exchange,提问作者learning to code
相关产品推荐
相关产品推荐

