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

PostgreSQL中按name分组,将不同type的ID聚合至对应列的实现问题

PostgreSQL中按name分组,将不同type的ID聚合至对应列的实现问题

嗨,我明白你的问题啦!你想要按name分组,把对应不同type的ID分别聚合到两列里,但之前因为GROUP BY里带了type,导致结果拆成了多行,完全不是你想要的样子对吧?

问题的核心很简单:你之前的GROUP BY 1, type会让PostgreSQL把每个name下的不同type当成独立的分组,自然会输出多行。我们只需要仅按name分组,然后用条件聚合的方式,分别收集对应type的ID就可以了。

给你两种实用的写法,都能达到你想要的效果:

方法一:使用PostgreSQL专属的FILTER子句(可读性更强)

SELECT 
  name,
  ARRAY_AGG(DISTINCT id) FILTER (WHERE type IN (1, 3)) AS type_1_3_id,
  ARRAY_AGG(DISTINCT id) FILTER (WHERE type = 2) AS type_2_id
FROM products
GROUP BY name
ORDER BY name;

方法二:使用CASE表达式嵌套聚合(兼容性更广)

如果需要兼容其他数据库,或者更习惯通用SQL写法,可以用这种方式:

SELECT 
  name,
  ARRAY_AGG(DISTINCT CASE WHEN type IN (1, 3) THEN id END) AS type_1_3_id,
  ARRAY_AGG(DISTINCT CASE WHEN type = 2 THEN id END) AS type_2_id
FROM products
GROUP BY name
ORDER BY name;

用你的示例数据测试的话,输出结果完全符合预期:

nametype_1_3_idtype_2_id
apple{23}{31}
orange{10,64}{10,70}

(注:apple的type_1_3_id是{23},因为你的数据里apple对应type1和3的id都是23,加了DISTINCT之后就只剩唯一值啦)

备注:内容来源于stack exchange,提问作者sh4rkyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 10:34:51