【问题标题】:How to group on a column, array aggregate on another and create a single JSON object keyed by the grouped column如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象
【发布时间】: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);

【问题讨论】:

    标签: json postgresql aggregate aggregate-functions


    【解决方案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) 
    

    【讨论】:

    • 我忽略了那个。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多