json - 如何在一个列上分组,在另一个列上聚合数组并创建一个由分组列键控的 JSON 对象
问题描述
使用此查询和记录集:
选择 id,级别 FROM t; 编号 | 等级 ---------- 1 | 一个 2 | 一个 3 | 一个 4 | b 5 | b 6 | C 7 | C
如何将其转换为 JSON 对象,以级别列和 id 列上聚合的数组为键?我事先不知道存在哪些级别。
{
"a": [1, 2, 3],
"b": [4, 5],
"c": [6, 7]
}
我希望这样做:
SELECT json_object(
array_agg(level),
array_agg(ids)
)
FROM (
SELECT level, array_agg(id::TEXT) ids
FROM t
GROUP BY level
) t
但它返回:
错误:无法累积不同维度的数组
如果您想回答,这里是t
为了您的方便
SELECT id, level
FROM ( VALUES
(1, 'a'),
(2, 'a'),
(3, 'a'),
(4, 'b'),
(5, 'b'),
(6, 'c'),
(7, 'c')
) t(id, level);
解决方案
使用 json(b)聚合函数:
with my_table(id, level) as (
values
(1, 'a'),
(2, 'a'),
(3, 'a'),
(4, 'b'),
(5, 'b'),
(6, 'c'),
(7, 'c')
)
select jsonb_object_agg(level, ids)
from (
select level, jsonb_agg(id) as ids
from my_table
group by level
) s
jsonb_object_agg
--------------------------------------------
{"a": [1, 2, 3], "b": [4, 5], "c": [6, 7]}
(1 row)
推荐阅读
- python - Python将字符串转换为十六进制然后转换为字节
- terraform - 运行 Terraform apply aws_ecs_task_definition 失败并出现错误:ClientException:角色无效
- linux - 在linux终端中更改多行命令的行
- firebase - 数据更改时 Flutter Firebase 监听运行两次
- c# - 使用 SendGrid v3 发送电子邮件批处理
- c# - 调用 SaveChangesAsync() 时如何找出哪些列违反了哪些约束(和检查)
- python - 如何从文件夹中读取所有文本并将与图像jpg文件同名的txt文件保存在其他文件夹python中
- unix - 经典的 Unix 锁文件:无需竞争即可检测过时的锁
- python - 在谷歌地图上创建的刮地图
- javascript - JavaScript 计算器 - 允许负数作为第一个操作数