首页 > 解决方案 > Postgres plpgsql 聚合函数过滤每个组的长度

问题描述

求plpgsql聚合函数帮助,不知道能不能实现。在此先感谢您的帮助

Table
_id   group_id   content    num   len
0        2          tab      1     3
1        2          name     2     4
2        1          tag      1     3
3        1          bag      2     3
4        1          a        3     1
5        2          b        3     1
6        1          bo       4     2 
7        2          an       4     2

我想实现一个聚合函数根据group_id进行聚合,num是按排序顺序处理的,然后在函数中判断len是否小于等于2就跳过,然后每次返回指定长度的数据聚合。

example:
with sorted_table as(select * from Table order by num)
select my_func(content, len, 2(required_num)) from sorted_table group by group_id;

expect result

_id   group_id   content    num   len
0        2          tab      1     3
1        2          name     2     4
2        1          tag      1     3
3        1          bag      2     3

比如需要对每组的前10名(required_num)进行排序,按照每组的num排序,依次比较前10名的内容。如果相似度太高(我可以使用select相似度判断),过滤掉,以此类推达到每组10个Claim。也可能是这个

group_id  result
2         [{"num":1,"content":"tab","len":3,"_id":0},{"num":2,"content":"name","len":4,"_id":1}]
1         [{"num":1,"content":"tag","len":3,"_id":2},{"num":2,"content":"bag","len":3,"_id":3}]

标签: sqlpostgresqlgroup-bypostgresql-11

解决方案


据我了解这个问题,您实际上并不需要自定义聚合:

select group_id, 
       jsonb_agg(t) filter (where len <= 2) as result
from the_table t
group by group_id;

推荐阅读