Postgresql 数组或jsonb对象的计数频率

Postgresql 数组或jsonb对象的计数频率,postgresql,jsonb,Postgresql,Jsonb,在pg中,有一个类型为varchar的标记字段,包含由]分隔的标记,例如'a]b]c' 需要计算这些标记在多行中的出现次数 我知道如何: 将原始字符串转换为pg数组['a','b','c'] 如果列被指定为jsonb对象{'a':1,'b':1,'c':1},则可以通过jsonb函数计算频率 但是我不知道如何将pg数组['a',b',c']转换成jsonb对象{'a':1',b':1',c':1},或者直接计算数组元素的频率 问题是: A.如何将文本'A]b]c'转换为jsonb对象{'A

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

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

我知道如何:

  • 将原始字符串转换为pg数组
    ['a','b','c']
  • 如果列被指定为jsonb对象
    {'a':1,'b':1,'c':1}
    ,则可以通过jsonb函数计算频率
但是我不知道如何将pg数组
['a',b',c']
转换成jsonb对象
{'a':1',b':1',c':1}
,或者直接计算数组元素的频率

问题是:

  • A.如何将文本
    'A]b]c'
    转换为jsonb对象
    {'A':1,'b':1,'c':1}
    ,所有值均为
    1
  • B.如何跨多行计算数组元素的频率
如果这两个问题中的任何一个都能解决,那么原来的问题就可以解决了。
或者,还有更好的解决方案吗


@更新-使问题更清楚 如果输入列已经是json对象,而不是原始字符串或数组

下表显示了我想要做的事情:

-- 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的输出:

您可以选择阵列,例如:

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

您能解释一下如何跨多行计算数组元素['a'、'b'、'c']的频率吗。例如,如果有两行,其中行1-col-1=['a'、'b'、'a']和行2-col1=['c'、'a'、'b'],那么按行/列计算,您期望的输出是什么?@praxnet预期的输出是
{'a':2,'b':2,'c':2}
,元素的顺序并不重要。我已经用更多的信息更新了这个问题。你也可以看看这个问题: