从多列创建 JSON 个对象的数组
Creating array of JSON objects from multiple columns
我这里有以下数据集
id
key
category
avg_time_1
avg_time_2
1
1
10
10
20
2
1
20
30
40
3
2
10
10
50
4
2
20
60
70
我想创建一个查询,结果如下:
key
avg_time_1
avg_time_1
1
[{ "category": 10, "avg_time": 10},{ "category": 20, "avg_time": 20 }]
[{"category": 10, "avg_time": 20}, {"category": 20, "avg_time": 40}]
2
[{ "category": 10, "avg_time": 10},{ "category": 20, "avg_time": 60}]
[{"category": 10, "avg_time": 50}, {"category": 20, "avg_time": 70}]
这个想法只是以不同的方式将值 cols avg_time_1
和 avg_time_2
表示为 jsonb 值。
使用jsonb_build_object()
构建素数对象并jsonb_agg()
将它们聚合成json数组:
select
key,
jsonb_agg(jsonb_build_object('category', category, 'avg_time', avg_time_1)) as avg_time_1,
jsonb_agg(jsonb_build_object('category', category, 'avg_time', avg_time_2)) as avg_time_2
from data_to_agg_json
group by key
key | avg_time_1 | avg_time_2
-----+----------------------------------------------------------------------+----------------------------------------------------------------------
1 | [{"avg_time": 10, "category": 10}, {"avg_time": 30, "category": 20}] | [{"avg_time": 20, "category": 10}, {"avg_time": 40, "category": 20}]
2 | [{"avg_time": 10, "category": 10}, {"avg_time": 60, "category": 20}] | [{"avg_time": 50, "category": 10}, {"avg_time": 70, "category": 20}]
(2 rows)
我这里有以下数据集
id | key | category | avg_time_1 | avg_time_2 |
---|---|---|---|---|
1 | 1 | 10 | 10 | 20 |
2 | 1 | 20 | 30 | 40 |
3 | 2 | 10 | 10 | 50 |
4 | 2 | 20 | 60 | 70 |
我想创建一个查询,结果如下:
key | avg_time_1 | avg_time_1 |
---|---|---|
1 | [{ "category": 10, "avg_time": 10},{ "category": 20, "avg_time": 20 }] | [{"category": 10, "avg_time": 20}, {"category": 20, "avg_time": 40}] |
2 | [{ "category": 10, "avg_time": 10},{ "category": 20, "avg_time": 60}] | [{"category": 10, "avg_time": 50}, {"category": 20, "avg_time": 70}] |
这个想法只是以不同的方式将值 cols avg_time_1
和 avg_time_2
表示为 jsonb 值。
使用jsonb_build_object()
构建素数对象并jsonb_agg()
将它们聚合成json数组:
select
key,
jsonb_agg(jsonb_build_object('category', category, 'avg_time', avg_time_1)) as avg_time_1,
jsonb_agg(jsonb_build_object('category', category, 'avg_time', avg_time_2)) as avg_time_2
from data_to_agg_json
group by key
key | avg_time_1 | avg_time_2
-----+----------------------------------------------------------------------+----------------------------------------------------------------------
1 | [{"avg_time": 10, "category": 10}, {"avg_time": 30, "category": 20}] | [{"avg_time": 20, "category": 10}, {"avg_time": 40, "category": 20}]
2 | [{"avg_time": 10, "category": 10}, {"avg_time": 60, "category": 20}] | [{"avg_time": 50, "category": 10}, {"avg_time": 70, "category": 20}]
(2 rows)