/** stats_agg 是 PostgreSQL 的聚合函数工作方式类似于先前存在的聚集体(min(x),max(),avg()等),但计算一* 次,并返回他们都多的统计数据。返回的统计数据是count,min,max,mean,variance,skewness,和 kurtosis,但其他人可以加入。* * 我需要一个返回偏度和峰度的聚合,而不是为每个需要多次传递来计算平均值等的单独函数,我认为最好有一个聚合在一次传递中返回所有内容。* * 感谢 John D. Cook 和他的博客文章(https://www.johndcook.com/blog/skewness_kurtosis/)解释了如何做到这一点。* */CREATE TYPE _stats_agg_accum_type AS (n BIGINT,min DOUBLE PRECISION,max DOUBLE PRECISION,m1 DOUBLE PRECISION,m2 DOUBLE PRECISION,m3 DOUBLE PRECISION,m4 DOUBLE PRECISION
);CREATE TYPE _stats_agg_result_type AS (count BIGINT,min DOUBLE PRECISION,max DOUBLE PRECISION,mean DOUBLE PRECISION,variance DOUBLE PRECISION,skewness DOUBLE PRECISION,kurtosis DOUBLE PRECISION
);CREATE OR REPLACE FUNCTION _stats_agg_accumulator(_stats_agg_accum_type, DOUBLE PRECISION)
RETURNS _stats_agg_accum_type AS
$example_table$
DECLAREa ALIAS FOR $1;x ALIAS FOR $2;n1 BIGINT;delta DOUBLE PRECISION;delta_n DOUBLE PRECISION;delta_n2 DOUBLE PRECISION;term1 DOUBLE PRECISION;
BEGINIF x IS NOT NULL THENn1 = a.n;a.n = a.n + 1;delta = x - a.m1;delta_n = delta / a.n;delta_n2 = delta_n * delta_n;term1 = delta * delta_n * n1;a.m1 = a.m1 + delta_n;a.m4 = a.m4 + term1 * delta_n2 * (a.n*a.n - 3*a.n + 3) + 6 * delta_n2 * a.m2 - 4 * delta_n * a.m3;a.m3 = a.m3 + term1 * delta_n * (a.n - 2) - 3 * delta_n * a.m2;a.m2 = a.m2 + term1;a.min = LEAST(a.min, x);a.max = GREATEST(a.max, x);END IF;RETURN a;
END;
$example_table$
LANGUAGE plpgsql;CREATE OR REPLACE FUNCTION _stats_agg_finalizer(_stats_agg_accum_type)
RETURNS _stats_agg_result_type AS
$example_table$
BEGINRETURN ROW($1.n, $1.min,$1.max,$1.m1,$1.m2 / NULLIF(($1.n - 1.0), 0), CASE WHEN $1.m2 = 0 THEN NULL ELSE SQRT($1.n) * $1.m3 / NULLIF(($1.m2 ^ 1.5), 0) END, CASE WHEN $1.m2 = 0 THEN NULL ELSE $1.n * $1.m4 / NULLIF(($1.m2 * $1.m2) - 3.0, 0) END);
END;
$example_table$
LANGUAGE plpgsql;CREATE AGGREGATE stats_agg(DOUBLE PRECISION) (sfunc = _stats_agg_accumulator,stype = _stats_agg_accum_type,finalfunc = _stats_agg_finalizer,initcond = '(0,,, 0, 0, 0, 0)'
);/*** 自定义函数* 以下是根据具体项目需求和需求计算公式进行聚合(非标准聚合公式)*/
/* 求和 */
CREATE OR REPLACE FUNCTION sum(arr DOUBLE PRECISION[])
RETURNS DOUBLE PRECISION
LANGUAGE plpgsql AS
$function$
declareret DOUBLE PRECISION;item DOUBLE PRECISION;a DOUBLE PRECISION = 0;
beginFOREACH item IN ARRAY arrLOOPa = a + item;END LOOP;ret = a;RETURN ret;
END;
$function$
;/* 标准差 */
CREATE OR REPLACE FUNCTION stddev(arr DOUBLE PRECISION[])
RETURNS DOUBLE PRECISION
LANGUAGE plpgsql AS
$function$
DECLAREret DOUBLE PRECISION;item DOUBLE PRECISION;mean DOUBLE PRECISION;a DOUBLE PRECISION = 0;c INT = 0;
BEGINc = ARRAY_LENGTH(arr,1);mean = MEAN(arr);FOREACH item IN ARRAY arrLOOPa = a + POW(item - mean, 2);END LOOP;ret = POW(a / (c - 1), 0.5);RETURN ret;
END;
$function$
;/* 平均值 */
CREATE OR REPLACE FUNCTION mean(arr DOUBLE PRECISION[])
RETURNS DOUBLE PRECISION
LANGUAGE plpgsql AS
$function$
DECLAREret DOUBLE PRECISION;item DOUBLE PRECISION;a DOUBLE PRECISION = 0;c INT = 0;
BEGINc = ARRAY_LENGTH(arr, 1);FOREACH item IN ARRAY arrLOOPa = a + item;END LOOP;ret = a / c ;RETURN ret;
END;
$function$
;/*几何平均值*/
CREATE OR REPLACE FUNCTION public.geo_mean(arr DOUBLE PRECISION[])RETURNS DOUBLE PRECISIONLANGUAGE plpgsql
AS $function$
DECLAREret DOUBLE PRECISION;item DOUBLE PRECISION;a DOUBLE PRECISION = 0;c INT;
BEGINFOREACH item IN ARRAY arrLOOPIF a = 0 THENa = item;ELSEa =  ROUND(CAST(a AS NUMERIC), 5) * ROUND(CAST(item AS NUMERIC), 5);END IF;END LOOP;c = ARRAY_LENGTH(arr, 1);ret = POW(a, 1.0 / c);RETURN ret;EXCEPTION WHEN OTHERS THENRAISE NOTICE '异常数据:ret = % item= % a= % c= %', ret, item, a, c;RETURN 'NaN';
END;
$function$
;/* 几何标准差 */
CREATE OR REPLACE FUNCTION geo_std(arr DOUBLE PRECISION[])
RETURNS DOUBLE PRECISION
LANGUAGE plpgsql AS
$function$
declareret DOUBLE PRECISION;item DOUBLE PRECISION;a DOUBLE PRECISION = 0;b DOUBLE PRECISION = 0;base NUMERIC = 10.0;c INT = 0;
BEGINFOREACH item IN ARRAY arrLOOPa = a + POW(LOG(base, item::NUMERIC), 2.0);b = b + LOG(base, item::NUMERIC);END LOOP;b = POW(b, 2);c = ARRAY_LENGTH(arr, 1);ret = 10 ^ (POW(((a - b / c) / (c - 1)), 0.5));RETURN ret;
END;
$function$
;/* 偏度系数 */
CREATE OR REPLACE FUNCTION skewness(arr DOUBLE PRECISION[])
RETURNS DOUBLE PRECISION
LANGUAGE plpgsql AS
$function$
DECLAREret DOUBLE PRECISION;item DOUBLE PRECISION;a DOUBLE PRECISION = 0;mean DOUBLE PRECISION = 0;std_val DOUBLE PRECISION = 0;c INT = 0;
BEGINc = ARRAY_LENGTH(arr,1);mean = MEAN(arr);std_val = STDDEV(arr);FOREACH item IN ARRAY arrLOOPa = a + (POW(item - mean, 3) / POW(std_val, 3));END LOOP;ret = ((1 / (c - 1)::DOUBLE PRECISION) * a);RETURN ret;
END;
$function$
;/* 峰度系数 */
CREATE OR REPLACE FUNCTION kurtosis(arr DOUBLE PRECISION[])
RETURNS DOUBLE PRECISION
LANGUAGE plpgsql AS
$function$
DECLAREret DOUBLE PRECISION;item DOUBLE PRECISION;a DOUBLE PRECISION = 0;mean DOUBLE PRECISION = 0;std_val DOUBLE PRECISION = 0;c INT = 0;
BEGINc = ARRAY_LENGTH(arr, 1);mean = MEAN(arr);std_val = STDDEV(arr);FOREACH item IN ARRAY arrLOOPa = a + (POW(item - mean, 4) / POW(std_val, 4));END LOOP;ret = ((1 / (c-1)::DOUBLE PRECISION) * a) - 3;RETURN ret;
END;
$function$
;

自定义函数中用到的几个公式

 1、 平均值

2、标准差

3、几何平均值

 4、几何标准差

5、偏度系数

6、峰度系数

Java代码实现commons-math之常用科学计算

数据库自定义聚合函数(求和、标准差、平均值、几何平均值、几何标准差、偏度系数、峰度系数)相关推荐

  1. mysql聚合函数求和

    mysql查询需要多次使用聚合函数值 (selectcount(*)fromtableA)-(selectmaxfromtableBwheretableB.username=tableA.uernam ...

  2. SqlServer自定义聚合函数

    sqlserver2017版本包括以上的可以使用string_agg(字段,',')函数 sqlserver查询版本: select @@version Sql Server自定义聚合函数详细bai步 ...

  3. oracle 自定义 聚合函数

    Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object (  --聚合函数的实质就是一个对象       sum ...

  4. sql数据库查询聚合函数_如何使用SQL Server数据质量服务确保正确的数据聚合

    sql数据库查询聚合函数 介绍 (Introduction) An interesting opportunity arose at a client site during early Octobe ...

  5. pythontransform详解_Python自定义聚合函数merge与transform区别详解

    1.自定义聚合函数,结合agg使用 2. 同时使用多个聚合函数 3. 指定某一列使用某些聚合函数 4.merge与transform使用 import pandas as pd import nump ...

  6. Presto如何开发自定义聚合函数

    (一)先了解一下什么是自定义聚合函数 其实就是根据你自己的业务去进行定义你自己想要实现的方法,比如说Mysql中的sum() 方法,就是求某个字段的累加之和,那么你就可以自己实现自己的 比如说 add ...

  7. SQL Server 数据库之聚合函数

    聚合函数 1. 概述 2. 聚合函数 2.1 Sum 函数求和 2.2 Avg 求平均值 2.3 Min 函数返回最小值 2.4 Max 函数返回最大值 2.5 Count 函数统计表记录数 2.6 ...

  8. 95-910-148-源码-FlinkSQL-Flink SQL自定义聚合函数

    1.美图 2.基本使用 ​ Flink Table/SQL Api中自带了一些常见的聚合函数,例如sum.min.max等,但是在实际开发中需要自定义符合业务需求的聚合函数,先从一个实际案例入手:设备 ...

  9. 【大数据】Presto开发自定义聚合函数

    Presto 在交互式查询任务中担当着重要的职责.随着越来越多的人开始使用 SQL 在 Presto 上分析数据,我们发现需要将一些业务逻辑开发成类似 Hive 中的 UDF,提高 SQL 使用人员的 ...

  10. Flink SQL自定义聚合函数

    <2021年最新版大数据面试题全面开启更新> 本篇幅介绍Flink Table/SQL中如何自定义一个聚合函数,介绍其基本用法.撤回定义以及与源码结合分析每个方法的调用位置. 基本使用 F ...

最新文章

  1. 实例分割最新最全面综述:从Mask R-CNN到BlendMask
  2. windows程序崩溃生成dump文件
  3. Machine Learning week 7 quiz: programming assignment-Support Vector Machines
  4. 剑指Offer #03 从尾到头打印链表(递归)
  5. SLAM | 使用三维位姿图优化减少单目视觉里程计(3D Visual Odometry)定位轨迹的漂移(附源代码)
  6. ActiveMQ 事务消息 手工签收
  7. python 温度插值nan处理_Python处理inf和Nan值,pytorch,nan,数值
  8. 以下十种性格的人不适合做程序员,你​赞同吗? ​
  9. vue---day03
  10. Java数组(1)--数组概述
  11. 论文笔记(Neural Collaborative Filtering)
  12. PC版微信,也终于上线了这个超赞的功能
  13. WEB运用程序如何实现高效可维护?
  14. vb6.0企业版win7_比win7更快?官方精简win10:3G+不更新,旧电脑福音
  15. Spring的定时任务
  16. db4o官方入门教程翻译--06.集合和数组
  17. AngularJS track by $index引起的思考
  18. Mac那些你不知道的 :自带计算器的隐藏功能
  19. 鸿蒙系统30个G,鸿蒙系统升级,为何固定大小有5.9G,也有3点几G呢?
  20. IDEA打包jar包详尽流程

热门文章

  1. JSP基本语法(2)函数
  2. Sequelize多表联合查询案例
  3. 傅里叶分析 [作 者:韩 昊]
  4. 1384. 按年度列出销售总额
  5. 好用的在线ide------ideone
  6. excel表转成PDF文档
  7. 第三方微信和支付宝的支付流程
  8. 青果教务系统适配小爱课程表
  9. freeSSL申请证书加阿里云域名解析加nginx配置
  10. 佛系程序员之歌 - 和我一起减减压