【问题标题】:Storing formula (equations) in database to be evaluated later (SQL Server 2005)将公式(方程式)存储在数据库中以供稍后评估(SQL Server 2005)
【发布时间】:2012-03-15 15:21:33
【问题描述】:

我正在根据数据集计算线性回归。我不知道编译时的回归模型或参数数量。

我将回归方程作为字符串存储在 SQL Server 2005 数据库中

y = 3x^2 + 2x // just an example

当我需要进行预测时,我从数据库中获取方程式,用我预测的值替换 x,然后使用 NCalc 来评估结果字符串。

该方法似乎工作正常,但我想知道是否有更好的方法或我错过的 SQL Server 的内置功能可以让我在数据库端进行这些计算 /strong>。

【问题讨论】:

    标签: sql-server database sql-server-2005 formula equation


    【解决方案1】:

    您可以编写一个仍然使用 NCalc 进行计算的 CLR 存储过程。

    【讨论】:

      【解决方案2】:

      我建议按照这些思路将它放入一个函数中。然后,您可以直接调用该函数,并且能够轻松地将计算值包含在视图集中以进行报告。

      CREATE FUNCTION dbo.getRegression 
      ( @xvalue AS NUMERIC(18,2) --set the precision and scale as appropriate for your data
      )
      RETURNS NUMERIC(18,2)
          AS
          BEGIN
              DECLARE @yvalue as NUMERIC (18,2) 
              set @yvalue = POWER(2,(3*@xvalue)) + (2*@xvalue)
              RETURN @yvalue
          END
      ;
      

      【讨论】:

      • 感谢您的回复,但我不知道编译时的方程式(我给出的示例只是一个示例)。我使用的任何方法都必须是动态的。
      • @ken:它需要多动态?也就是说,如果你的回归总是 y = ax^2 + bx + c 的形式,那么你仍然可以编写这个函数,传入 a、b、c 和 x。由于这些都只是数字,因此请选择对预期范围有意义的数字数据类型。
      • @BenThul -- 我不知道回归模型或编译时回归参数的数量。所以,方程可以是三阶、四阶、五阶等多项式、对数、反对数等。
      • 我现在只是出于好奇而询问,因为有 2 种可行的解决方案可以满足上面提供的更多动态需求……但我想知道将工作转移到数据库端?
      【解决方案3】:

      这不是一个答案,但我没有足够的声誉来发表评论。

      “您可以编写一个仍然使用 NCalc 进行计算的 CLR 存储过程。”

      您可以这样做,但请记住,您只能添加对只能引用其他 Sql Server 项目的 Sql Server 项目的引用。因此,您可以创建一个 SqlServer 项目并链接 NCalc 项目中的所有文件并尝试构建它,但是您也必须对 NCalc 项目的所有引用执行相同的操作。并非所有这些都是开源的。我想您可以使用 Reflector 反编译所有这些引用并将这些文件也放入 SqlServer 项目中。

      但是,如果您确实做了所有这些并最终构建了您的解决方案,那么您可能会发现您只能将引用添加为 UNSAFE 引用,这意味着您必须开始更改各种 SqlSever 权限...

      到那时你可能会放弃。

      我想说的是,这里的工作比原始答案建议的要多得多!

      【讨论】:

        【解决方案4】:

        在 Sql Server 中,像 Select 2+2 这样的东西会返回 4。因此,您可以有一个存储过程,从数据库中读取字符串,然后构建另一个动态字符串,让我们调用它 (@SQLString) 并运行该查询.

        例如,在这种情况下,公式可以是 x + 2,然后您基于它构建一个动态字符串,然后调用 sp_executesql:

        EXEC sp_executesql @SQLString
        

        但是,在您走这条路之前,您应该阅读this article on Dynamic SQL

        我相信你做的很好。

        【讨论】:

        • 我认为可以避免动态 SQL 并达到所需的解决方案...既然可以避免,应该避免:-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多