如何在 Oracle SQL 或 PL/SQL 中实现标准正态 CDF?

Viv*_*vek -4 sql oracle plsql oracle11g

如何使用 Oracle SQL 或 PL/SQL 实现以下功能?

参考

小智 5

此存储过程给出的结果与 Calc 中的 NORMDIST 函数相同。需要传递的参数有x、平均值、标准差和累积。累积参数可以选择获取 x (0) 处的正态分布值或值 <=x (1) 的累积概率。

create or replace FUNCTION NORMDIST(x_value number,mean_value number,stddev_value number, cumulative NUMBER DEFAULT 0)
RETURN NUMBER IS

        x number;
        t number;
        z number;
        ans number;

BEGIN
  IF (stddev_value = 0) THEN
  RETURN 1;
  END IF;

  x := (x_value-mean_value)/stddev_value;

  IF cumulative = 1 THEN
    z := abs(x)/SQRT(2);
    t := 1/(1+0.5*z);
    ans := t*exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+t*(-0.82215223+t*0.17087277)))))))))/2;
    If (x <= 0)
     Then RETURN ans;
     Else return  1-ans;
    End if;
  ELSE

   RETURN 1/(sqrt(2*3.14159265358979)*stddev_value)*Exp(-(Power(x_value-mean_value,2)/(2*Power(stddev_value,2)) ));
  END IF;

END;
/
Run Code Online (Sandbox Code Playgroud)