PostgreSQL 9.6: как суммировать все атрибуты во вложенном jsonb? - PullRequest
0 голосов
/ 10 марта 2020

Я работаю с PostgreSQL 9.6.

Если суммировать все атрибуты в 1-ом уровне jsonb, мы можем сделать следующее:

drop table if exists tmp;
create table tmp(id bigserial PRIMARY KEY NOT NULL, data jsonb);
insert into tmp(data) values
('{"a":100,"b":200,"c":300}'),('{"a":10,"b":20,"c":30}'),('{"a":1,"b":2,"c":3}');
select jsonb_object_agg(key, sum)
from
(
    select key, sum(value::int)
    from tmp 
    cross join jsonb_each_text(data)
    group by key
) tmp_each;

результат:

{"a":111,"b":222,"c":333}

Но если jsonb подал с вложенным jsonb более чем на 1 уровень, как показано ниже:

insert into tmp(data) values
('{
  "a": {
    "a1": 110,
    "a2": 120,
    "a3": 130,
    "a4": {
      "a41": 141,
      "a42": 142,
      "a43": 143,
      "a44": 144,
      "a45": 145
    }
  },
  "b": 200,
  "c": 300
}'),
('{
  "a": {
    "a1": 1110,
    "a2": 1120,
    "a3": 1130,
    "a4": {
      "a41": 1141,
      "a42": 1142,      
      "a45": 1145
    }
  },
  "b": 1200,
  "c": 1300
}'),
('{
  "a": {
    "a1": 110,
    "a2": 120,
    "a3": 130,
    "a4": {      
      "a42": 142,
      "a43": 143,
      "a44": 144
    }
  },
  "b": 200,
  "c": 300
}');

Я могу легко использовать расширение jsonb_deep_sum:

https://github.com/furstenheim/jsonb_deep_sum

SELECT jsonb_deep_sum(data) FROM tmp;

результат:

{
  "a": {
    "a1": 1330,
    "a2": 1360,
    "a3": 1390,
    "a4": {
      "a41": 1282,
      "a42": 1426,
      "a43": 286,
      "a44": 288,
      "a45": 1290
    }
  },
  "b": 1600,
  "c": 1900
}

Но если я хочу использовать SQL без использования расширения jsonb_deep_sum, как завершить sh SQL?

Большое спасибо за просмотр моего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...