如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 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:可以允许在指定列上而不是在其他列上进行分组

如何对多个列上的数据集进行分组并同时进行不同的聚合? Python

SQL Server:在具有两列的表上进行无聚合的旋转

在另一列上分组后查找列值的最大出现次数

是否可以在 Hive 中的常量列上进行分组?

数据聚合与分组运算