PostgreSQL:如何对包含 JSONB 字段的属性求和,并保留 table 形状?
PostgreSQL: How to SUM attributes including a JSONB field, and retain table shape?
我正在使用 Postgres 9.4。我有一个带有 JSONB 字段的 table:
Column │ Type │ Modifiers
─────────────────┼──────────────────────┼────────────────────────────────────────────────────────────────────
id │ integer │ not null default
practice_id │ character varying(6) │ not null
date │ date │ not null
pct_id │ character varying(3) │
astro_pu_items │ double precision │ not null
astro_pu_cost │ double precision │ not null
star_pu │ jsonb │
我想按日期检索各种属性的总和值,包括 JSONB 数组中的任何内容(假设深度为 1 是安全的),以及 return 中的值与原始 table 中的结构相同。
这是我现在正在使用的查询:
SELECT date,
SUM(total_list_size) AS total_list_size,
json_object_agg(key, val)
FROM (
SELECT date,
SUM(total_list_size) AS total_list_size,
key, SUM(value::numeric) val
FROM frontend_practicelist p, jsonb_each_text(star_pu)
GROUP BY date, key
) p
GROUP BY date
ORDER BY date;
它不会失败,JSON 以字典的形式呈现,这正是我想要的。但是,total_list_size
的总和看起来太大了。我认为它必须被总结两次。
如何获得 total_list_size
的正确求和值,同时保持相同的形状结果?
子查询中的函数 jsonb_each_text()
导致列 total_list_size
被复制的次数与 star_pu
中的项目数一样多,因此 avg()
显示了正确的结果。
要为 date
获得一个 total_list_size
,您可以使用并行子查询来独立累积值。
select *
from (
select date, json_object_agg(key, val) total_star_pu
from (
select date, key, sum(value::numeric) val
from frontend_practicelist, jsonb_each_text(star_pu)
group by date, key
) s
group by date
) s
join (
select date, sum(total_list_size) total_list_size
from frontend_practicelist
group by date
) t
using(date)
order by date;
我写了一个 Postgres extension 来总结 json。一旦你安装了它,你可以简单地做:
select date, sum(total_size_list), jsonb_deep_sum(star_pu) from frontend_practicelist;
我正在使用 Postgres 9.4。我有一个带有 JSONB 字段的 table:
Column │ Type │ Modifiers
─────────────────┼──────────────────────┼────────────────────────────────────────────────────────────────────
id │ integer │ not null default
practice_id │ character varying(6) │ not null
date │ date │ not null
pct_id │ character varying(3) │
astro_pu_items │ double precision │ not null
astro_pu_cost │ double precision │ not null
star_pu │ jsonb │
我想按日期检索各种属性的总和值,包括 JSONB 数组中的任何内容(假设深度为 1 是安全的),以及 return 中的值与原始 table 中的结构相同。
这是我现在正在使用的查询:
SELECT date,
SUM(total_list_size) AS total_list_size,
json_object_agg(key, val)
FROM (
SELECT date,
SUM(total_list_size) AS total_list_size,
key, SUM(value::numeric) val
FROM frontend_practicelist p, jsonb_each_text(star_pu)
GROUP BY date, key
) p
GROUP BY date
ORDER BY date;
它不会失败,JSON 以字典的形式呈现,这正是我想要的。但是,total_list_size
的总和看起来太大了。我认为它必须被总结两次。
如何获得 total_list_size
的正确求和值,同时保持相同的形状结果?
子查询中的函数 jsonb_each_text()
导致列 total_list_size
被复制的次数与 star_pu
中的项目数一样多,因此 avg()
显示了正确的结果。
要为 date
获得一个 total_list_size
,您可以使用并行子查询来独立累积值。
select *
from (
select date, json_object_agg(key, val) total_star_pu
from (
select date, key, sum(value::numeric) val
from frontend_practicelist, jsonb_each_text(star_pu)
group by date, key
) s
group by date
) s
join (
select date, sum(total_list_size) total_list_size
from frontend_practicelist
group by date
) t
using(date)
order by date;
我写了一个 Postgres extension 来总结 json。一旦你安装了它,你可以简单地做:
select date, sum(total_size_list), jsonb_deep_sum(star_pu) from frontend_practicelist;