如何解决聚合函数指定处理的字段顺序,聚合后每组返回指定大小的数据并终止
首先感谢您的帮助。
sorted_id
是在 group_id
分组后排序的 id。希望按照group_id
聚合,按sorted_id
顺序返回。并且可以指定返回的次数(比如required num),比如指定每组的前3个返回,如果content
在前三个之间相似度高,则过滤掉,然后,直到返回三条数据。
Table
_id group_id content sorted_id
0 2 tab 1
1 2 name 2
2 1 tag 1
3 1 bag 2
4 1 a 3
5 2 b 3
6 1 bo 4
7 2 an 4
预期
像 tag
和 bag
是相似性将过滤 bag
为 group_id 1。像 'tab' 和 'tac' 为 group_id 2 将过滤 tac。因为 sorted_id 顺序。
其实我只需要根据每组的前N个内容进行过滤,如果有相似的值就过滤掉。为了避免遍历所有数据,希望按照sorted_id进行处理,满足则终止。结果与此类似。
_id group_id content sorted_id
0 2 tab 1
2 1 tag 1
4 1 a 3
5 2 b 3
6 1 bcca 4
7 2 an 4
我写了一些 plpgsql 函数,但我没有好的想法。
CREATE OR REPLACE FUNCTION similarity_str(content_array text[],content text,similarity_threshold float,required_num integer) RETURNS integer AS $$
DECLARE
store_content text;
similarity float;
is_ok bool := FALSE;
BEGIN
IF array_length(content_array,1)= required_num THEN
RETURN 0;
END IF;
IF sentence_info is NULL THEN
sentence_info := array_append(sentence_info,content);
ELSE
FOREACH store_content IN ARRAY sentence_info
LOOP
EXECUTE format('select similarity($1,$2)')using store_content,content INTO similarity;
IF similarity>similarity_threshold THEN
is_ok := FALSE;
EXIT;
END IF;
is_ok := TRUE;
END LOOP;
if is_ok THEN
sentence_info := array_append(sentence_info,content);
is_ok := FALSE;
RETURN 1;
END IF;
END IF;
RETURN 0;
END;
$$ LANGUAGE plpgsql;
非常感谢您阅读本文。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。