我有以下例子:
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
我希望结果是这样的:
| 姓名|type_1_3_id| type_2_id|
| - -----|- -----|- -----|
| 苹果|二十三|三十一|
| 橙子|{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
2条答案
按热度按时间dtcbnfnu1#
在
array_agg
函数中使用filter
子句:使用条件聚合
array_agg(case when... then ... end)
时,不匹配的行返回空值,而过滤器只聚合where子句中指定的行。如果指定了FILTER,则只有filter_clause计算为true的输入行才被提供给聚合函数;其它行被丢弃。
Demo
dfddblmv2#
由于您需要
DISTINCT
值,并且还需要排除空值,所以不能开箱即用ARRAY_AGG()
。您可以单独筛选和聚合,然后加入这些聚合。例如:
结果:
请参见db<>fiddle上的运行示例。