通过与Postgresql中的其他一些列分组将多个JSONArray行变成一行

问题描述

我有一个查询select * from table的视图,该查询返回了以下数据

enter image description here

我想按名称相同的名称列进行分组,并合并如下所述的JSONArray列

enter image description here

解决方法

一种方法是取消嵌套数组,然后将它们聚合回去:

select t.id,t.name,jsonb_agg(a.e)
from the_table t
  cross join lateral jsonb_array_elements(t.json_array) as a(e)
group by t.id,t.name;

如果您经常执行此操作,则自定义聚合会使其更易于使用(但可能不会更快)

create function jsonb_array_combine(p_one jsonb,p_two jsonb)
  returns jsonb
as
$$
  select jsonb_agg(e)
  from (
    select e
    from jsonb_array_elements(p_one) as o(e)
    union all
    select e
    from jsonb_array_elements(p_two) as t(e)
  ) t
$$
language sql 
immutable;

create aggregate jsonb_array_agg(jsonb) 
(
  SFUNC = jsonb_array_combine(jsonb,jsonb),STYPE = jsonb
);

然后您可以像这样使用它:

select t.id,jsonb_array_agg(t.json_array)
from the_table t
group by t.id,t.name;