[英]How sum query json array object base on other column on postgresql
我使用 postgres 14.2 并有 3 列示例name , name_adds , aditional
并有规则:
{"default":[{"value_1": 100, "value_2": 0.1},{"value_1": 200, "value_2": 0.2}],
"non_default":[{"value_1": 200, "value_2": 0.1}, {"value_1": 400, "value_2": 0.1}]}
[
{
"value_1": 10,
"value_2": 11
},
{
"value_1": 1,
"value_2": 19
}
]
如何根据规则点 3 和 4 在点 2 上对格式 1 或 2 求和。对于如下逻辑
if (name == name_adds) {
if (additional contain default) {
sum (default->value_1)
} else {
// format 2.2
sum (value_1)
}
} else {
if (additional contain non_default) {
sum (default->value_1)
} else {
// format 2.2
sum (value_1)
}
}
预期结果:
桌子上的例子,假设我有如下表
name name_adds additional
---------------------------------------------------------------
john john {"default":[{"value_1": 100, "value_2": 0.1},
{"value_1": 200, "value_2": 0.2}],"non_default":
[{"value_1": 200, "value_2": 0.1}, {"value_1": 400,
"value_2": 0.1}]}
john doe {"default":[{"value_1": 100, "value_2": 0.1},
{"value_1": 200, "value_2": 0.2}],"non_default":
[{"value_1": 200, "value_2": 0.1}, {"value_1": 400,
"value_2": 0.1}]}
downy downy [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]
downy dan [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]
和预期的表为
name name_adds sum_result
---------------------------------------------------------------
john john 300
john doe 600
downy downy 11
downy dan 11
我做了下面的演示链接,但仍然没有达到预期的演示
with cte as (
select
name,
name_adds,
(name = name_adds) name_as_adds,
jsonb_path_query(additional,'$.default[*].value_1') ::numeric with_default
,jsonb_path_query(additional,'$.non_default[*].value_1')::numeric with_no_default
,jsonb_path_query(additional,'$[*].value_1')::numeric as ignore_defaults
from test_json),
cte2 as (
select
name, name_adds,
case when ignore_defaults is null and name_as_adds then with_default
when ignore_defaults is null and name_as_adds is false then with_no_default
when ignore_defaults is not null then ignore_defaults
end as cases
from cte)
select name, name_adds, sum(cases) as sum_result from cte2 group by 1, 2 order by 1 desc;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.