postgresql - 为内置聚合函数创建别名

标签 postgresql aggregate-functions

我正在使用 Postgres 对托管数据库进行本地测试。托管数据库有几个 Postgres 中不存在的功能。我不需要复制这些函数,但我需要能够调用具有相同名称的函数并得到合理的答案。例如,我想将计数函数别名为 approximate_count_distinct。一个示例查询是:

     select approximate_count_distinct(id)
     from table;

此查询的行为与计数完全相同。我不需要担心它与托管数据库不完全相同这一事实

我查看了 CREATE AGGREGATE,但无法获得正确的参数。这是我为 CREATE AGGREGATE 尝试做的事情:

   CREATE AGGREGATE approximate_count_distinct(*) 
   ( 
     sfunc = count, 
     stype = bigint, 
     initcond = 0 
   );

但它没有编译,因为它说 错误:函数 count(bigint) 不存在

我试图找到声明此函数的正确方法,但无可救药地迷路了。我查看了 pg_proc,但似乎以一种奇怪的方式将 count 定义为 aggregate_dummy 作为 src 符号链接(symbolic link)。

我查看了 ALIAS FOR 但这似乎不起作用。

长话短说,我不知道该怎么做才能让它发挥作用。肯定有一种简单的方法可以做到这一点?

最佳答案

使用count(*)聚合的声明,只是改个名字:

create aggregate approximate_count_distinct(*) (
    sfunc = int8inc,
    stype = int8,
    initcond = '0'
);

select count(*), approximate_count_distinct(*)
from generate_series(1, 100)

 count | approximate_count_distinct 
-------+----------------------------
   100 |                        100
(1 row)

您可以使用伪类型 anyelement 作为参数的泛型类型:

create aggregate approximate_count_distinct(anyelement) (
    sfunc = int8inc_any,
    stype = int8,
    initcond = '0'
);

select 
    approximate_count_distinct(id::int) as int,  
    approximate_count_distinct(id::dec) as dec,
    approximate_count_distinct(id::text) as text
from generate_series(1, 100) id

 int | dec | text 
-----+-----+------
 100 | 100 |  100
(1 row) 

关于postgresql - 为内置聚合函数创建别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268575/

相关文章:

java - mysql : Optimal way to do count(*) operation on a low cardinality column

PostgreSQL 聚合函数和缺失的帧行

sql - 如何从相邻表中动态数量的相关行获取聚合数据

postgresql - 如何设置 Helm Chart 依赖参数

sql - MySQL 中的 Max Function 没有按照我想象的方式工作

postgresql - pgAdmin4 导入文件错误 - 找不到文件

sql - 如何在postgresql中按周分组

sql - 单个查询中的多个 array_agg() 调用

postgresql - 当子句是模时,postgres可以使用索引吗

postgresql - 如何将参数传递给 db.exec