【问题标题】:Postgres The plpgsql aggregate function filters the length of each groupPostgres plpgsql 聚合函数过滤每个组的长度
【发布时间】:2021-01-26 14:37:29
【问题描述】:

求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}]

【问题讨论】:

  • CTE 中的order by 没用。它保证外部选择按该顺序处理行。

标签: sql postgresql group-by postgresql-11


【解决方案1】:

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

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

【讨论】:

  • 谢谢。当由group_id 字段聚合时,我想使用num 进行排序,并验证content 字段的内容。不匹配的将被过滤掉,每组在达到指定长度的数据后终止。你有什么好主意吗?
  • 您在寻找jsonb_agg(t order by t.num)吗?
  • 可以,比如需要对每组的前10名(required_num)进行排序,按照每组的num排序,依次比较前10名的内容。如果相似度太高(我可以用select similarity判断),过滤掉,以此类推,达到每组10个Claim。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2016-08-13
  • 2014-12-11
  • 2018-04-26
  • 2021-11-27
相关资源
最近更新 更多