Вложенные json агрегированные строки в group by в postgresql - PullRequest
2 голосов
/ 02 июля 2019

У меня есть таблица 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"]}

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

демо: дб <> скрипка

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. Чтобы поместить name s в один массив JSON, вы можете использовать агрегатную функцию json_agg()
  2. Сгруппируйте этот результат по country. Чтобы получить ожидаемый результат, вам нужно использовать агрегатную функцию json_object_agg(), которая создает значения ключа / пары из city и name array

Документация

0 голосов
/ 02 июля 2019
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;
...