如何将SQL查询结果按公司分组并生成员工信息数组?
解决方案:按公司分组并返回员工信息数组
没问题,我来帮你搞定这个需求!你现在的查询已经能筛选出符合公司员工数量限制的记录,接下来只需要在这个基础上做分组聚合,把每个公司的员工打包成数组就行。PostgreSQL提供了非常方便的JSON聚合函数,正好能满足你的格式要求。
修改后的完整SQL查询
SELECT c.pk, c.name, c.max, json_agg( json_build_object( 'name', e.name, 'joined', e.joined, 'rank', e.rank ) ORDER BY e.rank ) AS employees FROM ( -- 保留你原来的筛选逻辑:计算员工排名并过滤符合max限制的记录 SELECT e.*, c.max, row_number() OVER (PARTITION BY e.company ORDER BY e.joined DESC) AS rank FROM employees e JOIN companies c ON e.company = c.pk ) e JOIN companies c ON e.company = c.pk WHERE e.rank <= e.max OR e.max = -1 GROUP BY c.pk, c.name, c.max ORDER BY c.pk;
关键逻辑说明
- 内层子查询:和你原来的逻辑一致,先给每个公司的员工按入职时间倒序排名,同时关联公司的
max限制值。 - 外层分组聚合:
- 通过
GROUP BY c.pk, c.name, c.max按公司分组(因为pk是主键,分组后每个公司只会有一行结果) json_build_object()用来构造每个员工的JSON对象,把你需要的name、joined、rank字段打包进去json_agg()把分组内的所有员工JSON对象聚合成一个数组,加上ORDER BY e.rank可以保证数组内的员工按排名顺序排列
- 通过
- 结果格式:最终每个公司对应一行,
employees字段就是你想要的员工信息数组,比如Company A的结果会和你预期的格式完全匹配。
可选调整
如果你不需要JSON格式的数组,而是想要PostgreSQL原生的数组类型,可以把json_agg()换成array_agg(),比如:
array_agg( (e.name, e.joined, e.rank) ORDER BY e.rank ) AS employees
内容的提问来源于stack exchange,提问作者Nothingbetter
相关产品推荐
相关产品推荐

