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

标签 postgresql aggregate

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

这是一个例子。我有关系:模型(id int),其中模型是一堆 CAD 模型,每个模型都有一个 ID;我想找到所有 id>5 和 area>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。但我不知道如何传递输入参数,所以我想将它与最小/最大进行比较。

最佳答案

这没有多大意义。

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

您的问题描述似乎与聚合没有太大关系。所以一点也不清楚聚合函数与它有什么关系。

如果你真的需要写聚合函数,从 PostgreSQL 手册开始:

我强烈建议您使用 PL/PgSQL 或其他过程语言为聚合函数制作原型(prototype)。仅当您证明它可以使用更易于使用的语言工作并且确定您需要它比使用 PL/PgSQL 或 PL/Python 或其他语言更快时,才用 C 编写它。

无论如何,如果你想找到最小/最大的实现,从这里开始:

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.hmax的定义实际上只是引用了一个伪函数。

所以对于max(int4),它被定义为转换函数int4larger (src/backend/utils/adt/int.c ) 在转换类型 int4 上,使用排序运算符 >,没有最终函数。

关于postgresql - 如何向 PostgreSQL 添加自定义聚合函数(例如 MAX/MIN)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182721/

相关文章:

sql - 是否可以在不释放行锁的情况下提交一个事务并启动一个新事务?

postgresql - 聚合函数以保留特定值,具体取决于其他列

mysql - 使用外键将 MySQL 代码转换为 PostgreSQL

domain-driven-design - 是否可以在没有依赖注入(inject) (DDD) 的情况下在聚合(域层)中实现 MediatR?

r - group_by() summarise() 和权重百分比 - R

sql - 用于在表1,分组依据,总和中选择值的存储过程,然后将这些值插入表2

postgresql - 如何从 Google 电子表格连接到 Heroku Postgres

c++ - 如何将聚合支持到 STL 或类似 STL 的库中

r - 如何使用聚合和汇总函数来获取数据框中的唯一列?

ruby - 导轨 4 : activerecord create and update return value?