计算数组或 jsonb 对象的频率

Count freuency of array or jsonb object

在 pg 中,有一个 varchar 类型的标签字段,包含由 ] 分隔的标签,例如 'a]b]c'.

需要计算这些标签在多行中的出现次数。

我知道如何:

但是我不知道如何将 pg 数组 ['a', 'b', 'c'] 转换成 jsonb 对象 {'a':1, 'b':1, 'c':1},或者只是计算频率直接数组元素。

题目是:

如果这2个问题中的任何一个都能解决,那么原问题就解决了。
或者,还有更好的解决方案吗?


@Update - 让问题更清楚

如果输入列已经是 json 对象,而不是原始字符串或数组。

以下 table 显示我想做的事情:

-- create table,
create table json_aggr_learn (
    id serial8 primary key,
    uid int8,
    freq jsonb,
    created_at timestamptz default current_timestamp
);

-- init data
insert into json_aggr_learn(uid, freq) values
(1, '{"a":1, "b":2}'),
(1,'{"b":2, "c":4}'),
(2, '{"a":1, "b":2}'),
(2,'{"b":7, "c":4}'),
(2,'{"e":10, "c":4}'),
(3,'{"a":5, "c":4, "f":2}');

select * from json_aggr_learn limit 5;

-- aggr
select uid, jsonb_object_agg(key, value) as merged_freq
from
     (select id, uid, key, value
      from json_aggr_learn, jsonb_each_text(freq)
     ) as expended
group by uid
order by uid;

这是 aggr sql 的输出:

您可以 unnest() 数组,例如:

select id, jsonb_object_agg(tag, count) as tags
from (
    select id, unnest(string_to_array(tags, ']')) as tag, count(*)
    from my_table
    group by 1, 2
    ) s
group by 1
order by 1

Db<>fiddle.