数据库自定义聚合函数(求和、标准差、平均值、几何平均值、几何标准差、偏度系数、峰度系数)
/** 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之常用科学计算
数据库自定义聚合函数(求和、标准差、平均值、几何平均值、几何标准差、偏度系数、峰度系数)相关推荐
- mysql聚合函数求和
mysql查询需要多次使用聚合函数值 (selectcount(*)fromtableA)-(selectmaxfromtableBwheretableB.username=tableA.uernam ...
- SqlServer自定义聚合函数
sqlserver2017版本包括以上的可以使用string_agg(字段,',')函数 sqlserver查询版本: select @@version Sql Server自定义聚合函数详细bai步 ...
- oracle 自定义 聚合函数
Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象 sum ...
- sql数据库查询聚合函数_如何使用SQL Server数据质量服务确保正确的数据聚合
sql数据库查询聚合函数 介绍 (Introduction) An interesting opportunity arose at a client site during early Octobe ...
- pythontransform详解_Python自定义聚合函数merge与transform区别详解
1.自定义聚合函数,结合agg使用 2. 同时使用多个聚合函数 3. 指定某一列使用某些聚合函数 4.merge与transform使用 import pandas as pd import nump ...
- Presto如何开发自定义聚合函数
(一)先了解一下什么是自定义聚合函数 其实就是根据你自己的业务去进行定义你自己想要实现的方法,比如说Mysql中的sum() 方法,就是求某个字段的累加之和,那么你就可以自己实现自己的 比如说 add ...
- SQL Server 数据库之聚合函数
聚合函数 1. 概述 2. 聚合函数 2.1 Sum 函数求和 2.2 Avg 求平均值 2.3 Min 函数返回最小值 2.4 Max 函数返回最大值 2.5 Count 函数统计表记录数 2.6 ...
- 95-910-148-源码-FlinkSQL-Flink SQL自定义聚合函数
1.美图 2.基本使用 Flink Table/SQL Api中自带了一些常见的聚合函数,例如sum.min.max等,但是在实际开发中需要自定义符合业务需求的聚合函数,先从一个实际案例入手:设备 ...
- 【大数据】Presto开发自定义聚合函数
Presto 在交互式查询任务中担当着重要的职责.随着越来越多的人开始使用 SQL 在 Presto 上分析数据,我们发现需要将一些业务逻辑开发成类似 Hive 中的 UDF,提高 SQL 使用人员的 ...
- Flink SQL自定义聚合函数
<2021年最新版大数据面试题全面开启更新> 本篇幅介绍Flink Table/SQL中如何自定义一个聚合函数,介绍其基本用法.撤回定义以及与源码结合分析每个方法的调用位置. 基本使用 F ...
最新文章
- 实例分割最新最全面综述:从Mask R-CNN到BlendMask
- windows程序崩溃生成dump文件
- Machine Learning week 7 quiz: programming assignment-Support Vector Machines
- 剑指Offer #03 从尾到头打印链表(递归)
- SLAM | 使用三维位姿图优化减少单目视觉里程计(3D Visual Odometry)定位轨迹的漂移(附源代码)
- ActiveMQ 事务消息 手工签收
- python 温度插值nan处理_Python处理inf和Nan值,pytorch,nan,数值
- 以下十种性格的人不适合做程序员,你​赞同吗? ​
- vue---day03
- Java数组(1)--数组概述
- 论文笔记(Neural Collaborative Filtering)
- PC版微信,也终于上线了这个超赞的功能
- WEB运用程序如何实现高效可维护?
- vb6.0企业版win7_比win7更快?官方精简win10:3G+不更新,旧电脑福音
- Spring的定时任务
- db4o官方入门教程翻译--06.集合和数组
- AngularJS track by $index引起的思考
- Mac那些你不知道的 :自带计算器的隐藏功能
- 鸿蒙系统30个G,鸿蒙系统升级,为何固定大小有5.9G,也有3点几G呢?
- IDEA打包jar包详尽流程