PostgreSQL中的聚合JSON

PostgreSQL中的聚合JSON,json,postgresql,group-by,sum,pivot,Json,Postgresql,Group By,Sum,Pivot,我有一个json列,其中的条目如下所示: { "pages": "64", "stats": { "1": { "200": "55", "400": "4" }, "2": { "200": "1" }, "3": { "200": "1", "404": "13" }, } } “stats”是包含http状态代码和计数的集合(大小不同) 我想将统计数据聚合到两个计算列中-一个用于200响应的总数,另一个用于响应的总数(包括200s)。您可以使用两个横向

我有一个json列,其中的条目如下所示:

{
  "pages": "64",
  "stats": {
    "1": { "200": "55", "400": "4" },
    "2": { "200": "1" },
    "3": { "200": "1", "404": "13" },
  }
}
“stats”是包含http状态代码和计数的集合(大小不同)


我想将统计数据聚合到两个计算列中-一个用于
200
响应的总数,另一个用于响应的总数(包括
200
s)。

您可以使用两个横向连接来取消内部对象的测试,然后执行条件聚合:

select 
    sum(z.cnt::int) no_responses,
    sum(z.cnt::int) filter(where z.code::int = 200) no_200_responses
from mytable t
cross join lateral jsonb_each(t.data -> 'stats') as x(kx, obj)
cross join lateral jsonb_each_text(x.obj) as z(code, cnt)

no_responses | no_200_responses -----------: | ---------------: 74 | 57 没有回应|没有200 |回应 -----------: | ---------------: 74 | 57
太接近了,谢谢但我不需要汇总所有行的结果,我需要计算出每行的总数column@WillJenkins:好的,我想知道。如果表的主键是
id
,则只需在查询结束时
按id分组即可(您可能还希望将此列添加到
选择列表中)。boom!就这样,好的