Postgresql

聚合 JSON 列

  • January 16, 2018

我在 Postgres 中有一個帶有 JSON 列的表,我正在對行進行分組,我正在尋找一些可以從 jsons 中“總結”值的聚合函式。

sum aggregator 對整數求和,我正在尋找 JSON 的等效聚合器,例如這 2 個 JSON:

{a: 1, b: 4}
{b: 7, c: 3}

應匯總為

{a: 1, b: 11, c: 3}

請注意,衝突鍵中的值是相加的。JSON 總是’str->int'

在 Postgres 有可能嗎?或者是否可以編寫一個自定義聚合器來在 C 中做到這一點?

您需要首先將 JSON 數據標準化為可聚合的結果:

with data (doc) as (
 values 
   ('{"a": 1, "b": 4}'::jsonb), 
   ('{"b": 7, "c": 3}'::jsonb)
)
select k, v::int as val
from data, jsonb_each_text(doc) as t(k,v);

返回

k | v
--+--
a | 1
b | 4
b | 7
c | 3

現在可以按鍵聚合:

select k, sum(v::int) s
from data, jsonb_each_text(doc) as t(k,v)
group by k;

返回:

k | s
--+----
c |  3
a |  1
b | 11

現在可以將其轉換回來並聚合為 JSON:

select jsonb_object_agg(k,s) as doc
from (
 select k, sum(v::int) s
 from data, jsonb_each_text(doc) as t(k,v)
 group by k
) t

返回

doc                      
-------------------------
{"a": 1, "b": 11, "c": 3}

引用自:https://dba.stackexchange.com/questions/195492