有谁知道 Excel FDIST 和 FINV 的 SQL 中是否有兼容的函数?如果没有,有人知道如何构建它吗?可能在 C# 中?
谢谢。非常感谢您的帮助。
我已经设法通过使用 .Net Framework 4.0 及更高版本(System.Windows.Forms.DataVisualization.Charting.StatisticFormula)中的库来解决我的问题。
我可以使用上面的库在 C# 中开发一个函数用于我的计算过程。这是一个功能强大的库,您可以在其中找到最常用的统计公式(例如均值、中位数、t 分布、f 分布和它们的倒数。)
以下是我的代码片段:
using System.Windows.Forms.DataVisualization.Charting;
private Chart ch = new Chart(); // You will need to declare an object of Chart type, as Statistic Formula class does not have a public constructor
double fDist = ch.DataManipulator.Statistics.FDistribution(fRatioVariance, degreeFreedom1, degreeFreedom2);
希望这对其他人有帮助。谢谢。
虽然为时已晚,但下面是 SQL Server 本身的一些统计功能实现。
要获得 FDist 函数(相当于 Excel - FDist),我们将需要 Complete 和 Incomplete beta 函数以及 gamma 函数:
--GAMMA Function
CREATE FUNCTION [dbo].[udf_Gamma]
(
@x Float=NULL
)
RETURNS Float
AS
BEGIN
Declare @f Float = 10E99;
Declare @g Float = 1;
if ( @x > 0 )
Begin
while (@x < 3)
Begin
SET @g = @g * @x;
SET @x = @x + 1;
End
SET @f = (1 - (2/(7*power(@x,2))) * (1 - 2/(3*power(@x,2))))/(30*power(@x,2));
SET @f = (1-@f)/(12*@x) + @x*(log(@x)-1);
SET @f = (exp(@f)/@g)*power(2*PI()/@x,0.5);
End
else
Begin
SET @f = 10E99
End
return @f;
END
--BETA Complete Function
CREATE FUNCTION [dbo].[udf_BetaC]
(
@x Float=NULL
,@a Float=NULL
,@b Float=NULL
)
RETURNS Float
AS
BEGIN
--double betacf(double a,double b,double x){
Declare @maxIterations int = 50, @m int =1
Declare @eps Float = 3E-5
Declare @am Float = 1;
Declare @bm Float = 1;
Declare @az Float = 1;
Declare @qab Float = @a+@b;
Declare @qap Float = @a+1;
Declare @qam Float = @a-1;
Declare @bz Float = 1 - @qab*@x/@qap;
Declare @aold Float = 0;
Declare @em Float, @tem Float, @d Float, @ap Float, @bp Float, @app Float, @bpp Float;
while((@m<@maxIterations) AND (abs(@az-@aold)>=@eps*abs(@az)))
Begin
SET @em = @m;
SET @tem = @em+@em;
SET @d = @em*(@b-@m)*@x/((@qam + @tem)*(@a+@tem));
SET @ap = @az+@d*@am;
SET @bp = @bz+@d*@bm;
SET @d = -(@a+@em)*(@qab+@em)*@x/((@a+@tem)*(@qap+@tem));
SET @app = @ap+@d*@az;
SET @bpp = @bp+@d*@bz;
SET @aold = @az;
SET @am = @ap/@bpp;
SET @bm = @bp/@bpp;
SET @az = @app/@bpp;
SET @bz = 1;
SET @m = @m + 1;
End
return @az
END
--BETA INCOMPLETE Function
CREATE FUNCTION [dbo].[udf_BetaI]
(
@x Float=null
,@a Float=null
,@b Float=null
)
RETURNS Float
AS
BEGIN
Declare @bt Float=0.0
Declare @beta Float=0.0
if( @x=0 OR @x=1 )
Begin
SET @bt = 0
End
else if((@x>0) AND (@x<1))
Begin
SET @bt = (Select dbo.UDF_Gamma(@a+@b)* power(@x,@a)* power(1-@x,@b)/(dbo.UDF_Gamma(@a)*dbo.UDF_Gamma(@b)) )
End
if(@x<(@a+1)/(@a+@b+2))
Begin
SET @beta = (Select @bt*dbo.udf_betaC(@x,@a,@b)/@a)
End
else
Begin
SET @beta = (Select 1-@bt*dbo.udf_betaC(1-@x,@b,@a)/@b)
End
Return @beta
END
--FDist Function
CREATE FUNCTION [dbo].[udf_FDist]
(
@x Float=NULL
,@df1 Float=NULL
,@df2 Float=NULL
)
RETURNS Float
AS
BEGIN
Declare @x1 Float=(@x*@df1)/((@x*@df1)+@df2)
return (select 1 - dbo.udf_BetaI(@x1,(@df1/2),(@df2/2)))
END
检查 Excel =FDIST(0.5,1,1)=0.608173448 和 SQL 编辑器 = SELECT udf_FDIST(0.5,1,1)=0.608173457369209
问候, 阿维
在 MS SQL Server 中有standard_deviation 和一些更多的统计函数,包括方差。
还有一百万种变通方法,例如:http: //oreilly.com/catalog/transqlcook/chapter/ch08.html
,不过,您需要深入研究这些数学。