计算数组或 jsonb 对象的频率
Count freuency of array or jsonb object
在 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]b]c'
转换为 jsonb 对象 {'a':1, 'b':1, 'c':1}
,所有值为 1
.
- 乙。如何跨多行计算数组元素
['a', 'b', 'c']
的频率。
如果这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
在 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]b]c'
转换为 jsonb 对象{'a':1, 'b':1, 'c':1}
,所有值为1
. - 乙。如何跨多行计算数组元素
['a', 'b', 'c']
的频率。
如果这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