Postgresql
聚合 JSON 列
我在 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}