如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象
Posted
技术标签:
【中文标题】如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象【英文标题】:How to group on a column, array aggregate on another and create a single JSON object keyed by the grouped column 【发布时间】:2019-05-13 08:27:16 【问题描述】:有了这个查询和记录集:
选择 id,级别 FROM t; 编号 |等级 ---------- 1 |一种 2 |一种 3 |一种 4 | b 5 | b 6 | C 7 | C如何将其转换为 JSON 对象,以级别列和 id 列上聚合的数组为键?我事先不知道存在哪些级别。
"a": [1, 2, 3],
"b": [4, 5],
"c": [6, 7]
我希望这样做:
SELECT json_object(
array_agg(level),
array_agg(ids)
)
FROM (
SELECT level, array_agg(id::TEXT) ids
FROM t
GROUP BY level
) t
但它会返回:
错误:不能累积不同维度的数组
如果您想回答,这里是t
,为您提供方便
SELECT id, level
FROM ( VALUES
(1, 'a'),
(2, 'a'),
(3, 'a'),
(4, 'b'),
(5, 'b'),
(6, 'c'),
(7, 'c')
) t(id, level);
【问题讨论】:
【参考方案1】:使用json(b)aggregate functions:
with my_table(id, level) as (
values
(1, 'a'),
(2, 'a'),
(3, 'a'),
(4, 'b'),
(5, 'b'),
(6, 'c'),
(7, 'c')
)
select jsonb_object_agg(level, ids)
from (
select level, jsonb_agg(id) as ids
from my_table
group by level
) s
jsonb_object_agg
--------------------------------------------
"a": [1, 2, 3], "b": [4, 5], "c": [6, 7]
(1 row)
【讨论】:
我忽略了那个。谢谢。以上是关于如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章
Kendo UI Grid:可以允许在指定列上而不是在其他列上进行分组