oracle 如何实现excel的正态分布函数normdist
实现目标
EXCEL中的NORMDIST是指返回指定平均值和标准偏差的正态分布函数。此函数在统计方面应用范围广泛(包括假设检验)。
语法:
NORMDIST(x,mean,standard_dev,cumulative)
X 为需要计算其分布的数值。
Mean 分布的算术平均值。
Standard_dev 分布的标准偏差。
Cumulative 为一逻辑值,指明函数的形式。如果 cumulative 为 TRUE,函数 NORMDIST 返回累积分布函数;如果为 FALSE,返回概率密度函数。
如何在oracle中实现excel的NORMDIST函数?
实现思路分析
1、dbms_random.normal函数是用于生成一组正态分布的随机值。不满足要求;
2、java中可以通过apache-commons-math3.jar包实现正态分布函数计算;
3、oracle是否可通过函数调用Java代码?
java函数调用示例
import org.apache.commons.math3.distribution.NormalDistribution;public class normdist {/*** 计算正态分布值* * <pre>* 方法同excel NORMDIST 函数* </pre>* * @param x* 需要计算其分布的数值* @param mean* 分布的算术平均值* @param standard_dev* 标准偏差* @return 正态分布值*/public static double get(double x, double mean, double standard_dev) {return new NormalDistribution(mean, standard_dev).density(x);}public static void main(String[] args) {for (double d = 0; d < 1.0; d += 0.1) {System.out.println(String.format("%.1f\t %.5f", d, get(d, 0, 4)));}}}
输出:
0.0 0.099740.1 0.099700.2 0.099610.3 0.099460.4 0.099240.5 0.098960.6 0.098620.7 0.098220.8 0.097760.9 0.097241.0 0.09667
Oacle调用示例
oracle导入jar包
将jar包放到目录下:D:\dev\java_sources\commons-math3-3.0.jar
打开cmd命令窗口,加载jar包:commons-math3-3.0.jar 到oracle中
loadjava -r -f -o -user user/pwd@orcl commons-math3-3.0.jar
创建正态分布函数
-- 创建外部目录,存储jar包create or replace directory class_dir as 'D:\dev\java_sources';-- 查看目录select * from dba_directories;-- 创建java sourcescreate or replace and compile java source named normdistasimport org.apache.commons.math3.distribution.NormalDistribution;public class normdist{/*** 计算正态分布值* * <pre>* 方法同excel NORMDIST 函数* </pre>* * @param x* 需要计算其分布的数值* @param mean* 分布的算术平均值* @param standard_dev* 标准偏差* @return 正态分布值*/public static double get(double x_in, double mean_in, double standard_dev_in) {return new NormalDistribution(mean_in, standard_dev_in).density(x_in);}};-- 创建正态分布函数create or replace function fn_normdist(x_in in number, mean_in in number, standard_dev_in number) return number as language java name 'normdist.get(double,double,double)return double';-- 正态分布函数调用select fn_normdist(0, 0, 4) as n0, fn_normdist(1, 0, 4) as n1 from dual/*清理代码drop function fn_normdist;drop java source normdist;*/
调用截图:
参考
https://cloud.tencent.com/developer/ask/149846
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/jjdev/loadjava-tool.html#GUID-AEB08FAD-BE91-45D6-8338-031A70D97C59
https://www.cnblogs.com/mellowsmile/p/4602481.html