Excel FDist的兼容SQL函数

Excel FDist的兼容SQL函数,excel,tsql,Excel,Tsql,有人知道SQL for Excel FDIST和FINV中有兼容的函数吗?如果没有,有人知道如何建造吗?可能是C# 谢谢。非常感谢您的帮助。f Sql Server中不存在FINV 您可以编写一个SQL Server函数来实现两个excel功能 要在MS SQL Server中创建函数,有 以及一些统计函数,包括方差 还有一百万个变通办法,例如: 但是,你需要深入研究这些问题的数学 我通过使用.NETFramework4.0及更高版本的库(System.Windows.Forms.DataVis

有人知道SQL for Excel FDIST和FINV中有兼容的函数吗?如果没有,有人知道如何建造吗?可能是C#


谢谢。非常感谢您的帮助。

f Sql Server中不存在FINV

您可以编写一个SQL Server函数来实现两个excel功能

要在MS SQL Server中创建函数,有 以及一些统计函数,包括方差

还有一百万个变通办法,例如:


但是,你需要深入研究这些问题的数学

我通过使用.NETFramework4.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),我们需要完整和不完整的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
——伽马函数
创建函数[dbo]。[udf_Gamma]
(
@x Float=NULL
)
返回浮动
作为
开始
声明@f Float=10E99;
声明@g Float=1;
如果(@x>0)
开始
而(@x<3)
开始
设置@g=@g*@x;
设置@x=@x+1;
终点
设置@f=(1-(2/(7*幂(@x,2)))*(1-2/(3*幂(@x,2)))/(30*幂(@x,2));
设置@f=(1-@f)/(12*@x)+@x*(log(@x)-1);
设置@f=(exp(@f)/@g)*幂(2*PI()/@x,0.5);
终点
其他的
开始
设置为@f=10E99
终点
返回@f;
结束
--贝塔完全函数
创建函数[dbo]。[udf_BetaC]
(
@x Float=NULL
,@a Float=NULL
,@b Float=NULL
)
返回浮动
作为
开始
--双倍betacf(双倍a、双倍b、双倍x){
声明@maxIterations int=50,@m int=1
声明@eps浮动=3E-5
声明@am Float=1;
声明@bm Float=1;
声明@az Float=1;
声明@qab Float=@a+@b;
声明@qap Float=@a+1;
声明@qam Float=@a-1;
声明@bz Float=1-@qab*@x/@qap;
声明@aold Float=0;
声明@em Float、@tem Float、@d Float、@ap Float、@bp Float、@app Float、@bpp Float;
而((@m=@eps*abs(@az)))
开始
设置@em=@m;
设置@tem=@em+@em;
集@d=@em*(@b-@m)*@x/(@qam+@tem)*(@a+@tem));
设置@ap=@az+@d*@am;
设置@bp=@bz+@d*@bm;
集@d=-(@a+@em)*(@qab+@em)*@x/(@a+@tem)*(@qap+@tem));
设置@app=@ap+@d*@az;
设置@bpp=@bp+@d*@bz;
设置@aold=@az;
设置@am=@ap/@bpp;
设置@bm=@bp/@bpp;
设置@az=@app/@bpp;
设置@bz=1;
设置@m=@m+1;
终点
返回@az
结束
--贝塔不完全函数
创建函数[dbo]。[udf_BetaI]
(
@x Float=null
,@a Float=null
,@b Float=null
)
返回浮动
作为
开始
声明@bt Float=0.0
声明@beta Float=0.0
如果(@x=0或@x=1)
开始
设置为@bt=0
终点

否则if(@x>0)和(@xI)可以为FDIST和FINV创建一个函数。但是有没有地方或文档可以理解FDIST和FINV中涉及的方程。基本上我需要推导出这个公式。有什么想法吗?应该用
C.