Greenplum · 工具应用 · 自定义聚合函数

一、背景

  常见的聚合函数有sum、max、avg、min,但有些场景可以定制聚合函数解决特定的需求。本文给出自定义聚合函数的示例。

二、需求描述

实现一个工地搬砖的工资核算系统。

1.工地搬砖规则:

i.底薪:1000元

ii.搬一块砖:10元

iii.及时奖:100元

2.工作量信息

i)Jack

搬了三天砖,分别10,15,20 ;工资:1000+(10+15+20)*10 +100 = 1550元

ii)Tom

搬了三天砖,分别30,20,40;工资:1000+(30+20+40)*10 +100 = 2000元

三、需求实现

1、创建person表

CREATE TABLE person

(

        name    varchar(200),

        work              int

);

insert into person values('Jack',10),('Jack',15),('Jack',20);

insert into person values('Tom',30),('Tom',20),('Tom',40);

2.创建函数money_add

每天搬砖,劳动报酬进行增加。

CREATE FUNCTION money_add (numeric, numeric, numeric)

RETURNS numeric AS

$$

        SELECT $1 + $2*$3;

$$ LANGUAGE 'sql' 

STRICT;

3.创建函数money_total

劳动总报酬核算,100为及时奖金。

CREATE FUNCTION money_total(numeric)

RETURNS numeric AS

$$

        SELECT round($1 + 100, -1);

$$ LANGUAGE 'sql'

STRICT;

4.创建聚合函数work_money

用于输出工资报表。

CREATE AGGREGATE work_money(numeric, numeric)

(

        INITCOND = 1000,

        STYPE = numeric,

        SFUNC = money_add,

        FINALFUNC = money_total

);

5、结果验证

SELECT name,

        work_money(work, 10)

FROM person 

GROUP BY name;

图1工资单

四、其他链接

github链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。