有没有办法在PostgreSQL中顺序扫描的中间保持和更新全局值?

有没有办法在PostgreSQL中顺序扫描的中间保持和更新全局值?,postgresql,user-defined-functions,Postgresql,User Defined Functions,我正在用C创建一个PostgreSQL函数来比较最小值​​表的数组类型列中的部分和,并按升序输出3条记录 我想实现一个过程,如果值的总和超过第三个最小值,则不计算之后的总和。 有这样的方法吗 我创建了以下函数。如果我们可以在顺序扫描期间保持3个最小值,那么当tmp值超过最小值时,我们可以忽略无用的计算 C功能: PG_函数_信息_V1(元素之和); 资料 元素之和(PG函数参数) { //获取输入数组 ArrayType*a_ext=PG_GETARG_ArrayType_P(0); 基准*a;

我正在用C创建一个PostgreSQL函数来比较最小值​​表的数组类型列中的部分和,并按升序输出3条记录

我想实现一个过程,如果值的总和超过第三个最小值,则不计算之后的总和。 有这样的方法吗

我创建了以下函数。如果我们可以在顺序扫描期间保持3个最小值,那么当
tmp
值超过最小值时,我们可以忽略无用的计算

C功能:

PG_函数_信息_V1(元素之和);
资料
元素之和(PG函数参数)
{
//获取输入数组
ArrayType*a_ext=PG_GETARG_ArrayType_P(0);
基准*a;
bool*a_null;
Oid a_typed=ARR_ELEMTYPE(a_ext);
int16 a_typlen;
布尔·塔皮瓦尔;
字符a_类型对齐;
内华伦;
获取_typlenbyvalalign(a_typed,&a_typlen,&a_typebyval,&a_typealign);
解构数组(a_ext、a_typed、a_typelen、a_typebyval、a_typealign、&a、&a_null、&a_len);
//算计
浮点数;
对于(int i=0;itmp)
总和=tmp;
}
PG_返回_基准(浮动4GetDatum(总和));
}
SQL:

样本输入:

| id |            array_column              |
+----+--------------------------------------+
|  1 | array[0,0,1,1,1,1,1,2,3,4,5,6,7,8,9] |
|  2 | array[1,0,0,0,0,1,1,2,3,4,5,6,7,8,9] |
|  3 | array[1,1,1,1,1,1,1,2,3,4,5,6,7,8,9] |
|  4 | array[1,2,3,4,5,6,7,8,9,10,11,12,13] |
样本输出:

| id |            array_column              | sum5(min of sum_of_5_elements) |
+----+--------------------------------------+--------------------------------+
|  2 | array[1,0,0,0,0,1,1,2,3,4,5,6,7,8,9] |                1               |    
|  1 | array[0,0,1,1,1,1,1,2,3,4,5,6,7,8,9] |                3               |    
|  3 | array[1,1,1,1,1,1,1,2,3,4,5,6,7,8,9] |                5               |    

在计算
id
4的记录时,我想在
sum
超过第三个最小值到第(5)点时停止计算。

您的代码是什么,您尝试了什么?我添加了代码。任何帮助都将不胜感激。函数调用上下文将传递一个指针,您可以使用该指针分配在整个扫描过程中保持的内存。我不记得确切的细节,但查看一下现有函数应该会有所帮助。我搜索了相应的函数,但找不到它。你能告诉我现有的函数或源代码引用实际上使用全局内存吗?有没有人向我建议一个详细的方法?你的代码是什么,你尝试了什么?我添加了代码。任何帮助都将不胜感激。函数调用上下文将传递一个指针,您可以使用该指针分配在整个扫描过程中保持的内存。我不记得确切的细节,但查看一下现有函数应该会有所帮助。我搜索了相应的函数,但找不到它。你能告诉我实际使用全局内存的现有函数或源代码引用吗?有没有人向我建议一个详细的方法?
| id |            array_column              | sum5(min of sum_of_5_elements) |
+----+--------------------------------------+--------------------------------+
|  2 | array[1,0,0,0,0,1,1,2,3,4,5,6,7,8,9] |                1               |    
|  1 | array[0,0,1,1,1,1,1,2,3,4,5,6,7,8,9] |                3               |    
|  3 | array[1,1,1,1,1,1,1,2,3,4,5,6,7,8,9] |                5               |