【问题标题】:Aggregates in PostgreSQLPostgreSQL 中的聚合
【发布时间】:2019-05-06 06:58:28
【问题描述】:

编写一个聚合来计算数字 40 在列中出现的次数。

使用您的聚合来计算目录表中 40 岁的人数。

这就是我正在做的:

Create function aggstep(curr int) returns int as $$
begin
    return curr.count where age = 40;
end;
$$ language plpgsql;

Create aggregate aggs(integer) (
stype = int,
initcond = '',
sfunc = aggstep);

Select cas(age) from directory;

【问题讨论】:

    标签: postgresql user-defined-aggregate


    【解决方案1】:

    例如,您可以这样做:

    首先,创建一个过渡函数:

    CREATE FUNCTION count40func(bigint, integer) RETURNS bigint
       LANGUAGE sql IMMUTABLE CALLED ON NULL INPUT AS
    'SELECT $1 + ($2 IS NOT DISTINCT FROM 40)::integer::bigint';
    

    因为FALSE::integer 是 0 而TRUE::integer 是 1,所以这行得通。

    我使用 IS NOT DISTINCT FROM 而不是 =,以便它对 NULL 执行正确的操作。

    然后可以将聚合定义为

    CREATE AGGREGATE count40(integer) (
       SFUNC = count40func,
       STYPE = bigint,
       INITCOND = 0
    );
    

    然后你可以像这样查询

    SELECT count40(age) FROM directory;
    

    【讨论】:

    • 这太令人惊讶了——除非我完全错了,否则这应该可以解决你的作业问题。
    • 它实际上要求创建聚合并使用它从表中查找 40 岁的人数..考虑到我们有列年龄的表
    • 哦,我认为这很明显 - 我在答案中添加了一行。
    • 非常感谢,实际上我回顾了您的解决方案,它确实有效,非常感谢您的帮助。好的,我将再次开始查看文档,我已经完成了,但现在会更加注意
    • 我很高兴听到这个消息 - 我认为这只是一个误会。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2015-12-21
    • 2018-01-12
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多