You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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;

关键逻辑说明

  1. 内层子查询:和你原来的逻辑一致,先给每个公司的员工按入职时间倒序排名,同时关联公司的max限制值。
  2. 外层分组聚合:
    • 通过GROUP BY c.pk, c.name, c.max按公司分组(因为pk是主键,分组后每个公司只会有一行结果)
    • json_build_object()用来构造每个员工的JSON对象,把你需要的name、joined、rank字段打包进去
    • json_agg()把分组内的所有员工JSON对象聚合成一个数组,加上ORDER BY e.rank可以保证数组内的员工按排名顺序排列
  3. 结果格式:最终每个公司对应一行,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:07:59