如何向PostgreSQL添加自定义聚合函数(如MAX/MIN)?

如何向PostgreSQL添加自定义聚合函数(如MAX/MIN)?,postgresql,aggregate,Postgresql,Aggregate,我想在Postgresql中添加一些扩展函数,比如max/min,但是找不到它们的源函数。有人能建议我应该查看源代码的哪一部分吗?谢谢 这里有一个例子。我有关系:model(id int),其中model是一组CAD模型,每个模型都有一个id;我想找到id>5且面积>5的所有模型。但我不想计算所有的面面积,所以我使用having子句只计算一个子集。以下是查询: select model.id, model.face_number from model where id>5

我想在Postgresql中添加一些扩展函数,比如max/min,但是找不到它们的源函数。有人能建议我应该查看源代码的哪一部分吗?谢谢

这里有一个例子。我有关系:model(id int),其中model是一组CAD模型,每个模型都有一个id;我想找到id>5且面积>5的所有模型。但我不想计算所有的面面积,所以我使用having子句只计算一个子集。以下是查询:

select model.id, model.face_number
from
    model
where
    id>5
group by model.id
having
    area(model.id)>5;

我想将函数区域(oid)函数(如max/min)定义为FDW。但是我不知道如何传递输入参数,所以我想将其与min/max进行比较。

这没有多大意义

min
max
是聚合函数。它们将一组行缩减为单个值

您的问题描述似乎与聚合没有多大关系。因此,聚合函数是否与之相关还不清楚

如果确实需要编写聚合函数,请从PostgreSQL手册开始:

我强烈建议您使用PL/PgSQL或其他过程语言对聚合函数进行原型化。只有当您已经证明它可以使用一种更快的语言工作,并且确定您需要它的速度比使用PL/PgSQL或PL/Python或其他语言更快时,才可以用C编写它

无论如何,如果要找到min/max的实现,请从这里开始:

select a.*, so.oprname as aggsortopname, tt.typname as aggtranstypename
from pg_aggregate a 
inner join pg_proc p on (a.aggfnoid = p.oid) 
inner join pg_type tt on (a.aggtranstype = tt.oid)
inner join pg_operator so on (a.aggsortop = so.oid)
where p.proname = 'max';
在这里,您将看到聚合由多个部分组成:一个转换函数、一个排序运算符、一个过渡状态类型、一个可选的final函数等。关于用户定义聚合的文档对此进行了详细解释

所以没有单一的“最大函数”。
pg_proc.h
中的
max
定义实际上只是指一个伪函数


因此,对于
max(int4)
,它被定义为过渡类型
int4
上的过渡函数
int4larger
src/backend/utils/adt/int.c
),带有排序运算符
,没有最终函数。

您不需要对所描述的内容使用聚合函数。您也不应该担心性能,直到您有了一个工作版本——如果您编写以下代码,PostgreSQL的查询优化器可能会完全满足您的要求:

select model.id, model.face_number
from
    model
where
    id>5 and area(model.id)>5;
下面是一个示例函数:

CREATE FUNCTION area(int in_id)
RETURNS double precision AS $$
    SELECT length*width FROM model WHERE id=in_id;
$$ LANGUAGE SQL STABLE;

当然,你可以用一些更合适的计算来代替
length*width

仅仅“查看源代码”对这项任务的作用很小-询问真正的任务。参见@user2864740,我添加了一个示例。