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