我举了以下例子:

create table products (name text, id integer, type smallint, category integer);

insert into products values 
('apple', 23, 1, 1200),
('apple', 23, 1, 999),
('apple', 31, 2, 1200),
('apple', 23, 3, 1200),
('orange', 10, 1, 200),
('orange', 10, 2, 200),
('orange', 10, 2, 230),
('orange', 10, 3, 200),
('orange', 64, 1, 700),
('orange', 70, 2, 700);

DB FIDDLE

我希望结果是这样的:

name type_1_3_id type_2_id
apple 23 31
orange {10,64} {10,70}

但是Postgres强制我按列类型进行分组,这使得我的结果不是我想要的结果

select distinct name, 
case when type in (1,3) then array_agg(distinct id) end as type_1_3,
case when type = 2 then array_agg(distinct id) end as type_2
from products
group by 1, type
order by 1

推荐答案

array_agg函数中使用filter子句:

select name, 
 array_agg(distinct id) filter (where type in (1,3)) as type_1_3,
 array_agg(distinct id) filter (where type = 2) as type_2
from products
group by 1
order by 1

对于条件聚合array_agg(case when... then ... end),不匹配的行将返回空值,而过滤器将仅聚合WHERE子句中的指定行.

如果指定FILTER,则只将FILTER_CLOW计算结果为TRUE的输入行提供给聚合函数;其他行将被丢弃.

Demo

Sql相关问答推荐

Oracle SQL中的累计总数

获取每个帖子的匹配关键字列表

Select 最大值,但当并列时,从其他列 Select 最大值

在postgres中动态计算出现次数并插入到json中

为什么两个不同的窗口函数给出不同的排序结果?

MariaDB查询在逗号分隔的字符串中查找多个值

在SQL GROUP BY中的某些行之后执行计算

动态组/转置

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

使用左外部联接更正列中第+1行的值时重复

如何创建snowflake表(动态查找数据类型)并从阶段加载(AWS S3)?

什么是 100.它与 100 有什么区别?

如何从postgresql中的项目映射(关联数组)设置值?

将一名成员金额分配给群组内的其他成员

如何在 case 语句中使用聚合?

MariaDB非常简单的MATCHAGAINST查询不使用FULLTEXT索引吗?

IN子句使用的表值用户定义函数参数

for each 客户查找每个类别的最新评分

忽略与给定列匹配的行的 LAG 函数

Postgres 窗口函数未按预期工作