我有一个 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"]}
最佳答案
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
- 按
城市
对名称进行分组。要将name
放入一个JSON数组中,您可以使用聚合函数json_agg()
- 按
国家/地区
对此结果进行分组。要获得预期的输出,您需要使用聚合函数json_object_agg()
,它从city
和name
数组创建键/对值
关于json - postgresql中group by的嵌套json聚合行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56847585/