json - PostgreSQL 从现有数据创建 JSON 列
问题描述
给定如下数据:
+---+------------+------------
|id | change | date
+---+------------+------------
| 1 | name | 2018-06-20
| 2 | address | 2018-06-20
| 3 | email | 2018-06-20
| 4 | email | 2018-06-21
| 5 | address | 2018-06-22
| 6 | address | 2018-06-23
我正在尝试创建一个视图,将上述内容汇总到一个包含以下数据的 json 列中:
{"name":["2018-06-20"], "address":["2018-06-20","2018-06-22","2018-06-23"], "email":["2018-06-20","2018-06-21"]}
我一直在尝试使用 array_aggr、array_to_json、json_agg、array_build_object 函数来解决这个问题,但我似乎无法完全正确。
我希望有人能帮帮忙。
干杯
解决方案
您应该为两个级别使用两次 jsonb 聚合:
select jsonb_pretty(jsonb_object_agg(change, dates))
from (
select change, jsonb_agg(date) as dates
from my_table
group by change
) s
jsonb_pretty
-----------------------
{ +
"name": [ +
"2018-06-20" +
], +
"email": [ +
"2018-06-20",+
"2018-06-21" +
], +
"address": [ +
"2018-06-20",+
"2018-06-22",+
"2018-06-23" +
] +
}
(1 row)
请注意,这jsonb_pretty()
是不必要的,仅用于良好的输出。
推荐阅读
- javascript - HTML 输入不允许从键盘输入两位数
- reactjs - 无法将我的网格卡内容设置为等高
- c# - 如何将列表的子集添加到另一个列表中对象的属性 - 最佳/最快实践
- amazon-web-services - ansible-playbook 是否使用先前创建的变更集(如果存在)还是使用 playbook 和 var 运行?
- c# - 本地存储 PC 应用程序数据并与服务器数据库同步的最佳方式
- firebase - Flutter 和 Cloud Firestore 如何访问 2 级类别列表
- java - 如何查找字符串是否包含字典中的单词?
- angular - 将变量设置为异步函数内的值
- python - 将字典保存为 pyspark 数据框并加载它 - Python、Databricks
- python - 如果我随机选择一个项目,如何为列表中的项目分配一个 ID?