【问题标题】:nested json aggregated rows on group by in postgresqlpostgresql中group by的嵌套json聚合行
【发布时间】:2019-07-02 07:40:29
【问题描述】:

我有一个 postgresql 表

alok=# select * from people;
  name   | country |  city   
---------+---------+---------
 alok    | india   | delhi
 ram     | india   | kolkata
 shyam   | india   | kanpur
 krishna | us      | newyork
 ajit    | india   | delhi
 sami    | india   | delhi
 mohamad | india   | kolkata
(7 rows)

可以由

产生
create table people(name varchar, country varchar, city varchar);

insert into people values('alok', 'india', 'delhi');
insert into people values('ram', 'india', 'kolkata');
insert into people values('shyam', 'india', 'kanpur');
insert into people values('krishna', 'us', 'newyork');
insert into people values('ajit', 'india', 'delhi');
insert into people values('sami', 'india', 'delhi');
insert into people values('mohamad', 'india', 'kolkata');

我想生成国家和城市的聚合名称,例如

country |                name                
---------+------------------------------------
 india   | {"delhi":["alok", "ajit", "sami"], "kolkata":["ram", "mohamad"], "kanpur":["shyam"]}
 us      | {"newyork":["krishna"]}

【问题讨论】:

    标签: json postgresql group-by aggregate


    【解决方案1】:

    demo:db<>fiddle

    SELECT 
        country,
        json_object_agg(city, agg_names)
    FROM (
        SELECT
            country,
            city, 
            json_agg(name) AS agg_names
        FROM
            people
        GROUP BY country, city
    ) s
    GROUP BY country
    
    1. city 对名称进行分组。要将 names 放入一个 JSON 数组中,您可以使用聚合函数 json_agg()
    2. 将此结果按country 分组。要获得预期的输出,您需要使用聚合函数 json_object_agg()cityname 数组创建键/对值

    documentation

    【讨论】:

      【解决方案2】:
      select 
         country, json_agg( json_build_object( 'city', city, 'name', name  ) ) 
      from (
         select country, city, json_agg( name ) as name
         from people
         group by country, city 
      ) a 
      group by a.country;
      

      【讨论】:

      • 不要只发布代码。您还应该为您的答案添加一些解释。
      • 您的代码错误。您最终正在创建一个数组。这不是 TO 所期望的。查看差异:dbfiddle.uk/…
      猜你喜欢
      • 2021-02-25
      • 2017-06-08
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2021-07-21
      • 2014-11-22
      • 2014-12-27
      • 2012-04-27
      相关资源
      最近更新 更多