【问题标题】:TSQL Algebra - solve for x ((a)x < b)SQL 代数 - 求解 x ((a)x < b)
【发布时间】:2014-08-22 21:05:52
【问题描述】:

我有一个包含大约 940 行的表格。我正在创建一个需要解决以下问题的专门计算:

对于每一行,我可以将 A 乘以多少次而不超过 B。

我创建了一个 UDF 来执行此操作,如下所示:

DECLARE @x int;
DECLARE @Result decimal(18,4);
DECLARE @CutOff int;

SELECT @x=0, @CutOff=1000, @Result=null;

WHILE (((@Result < @tVal) or (@Result IS NULL)) AND @x < @CutOff) BEGIN 
    SET @x = @x + 1;
    SET @Result = @hProb * @x;
END

IF (@x = @CutOff)
    SET @x = -1;

RETURN @x;
  • @tVal 是我们希望达到的目标值。

  • @CutOff 是要乘以的最大数,如果 x 达到此数但仍未超过目标值,则停止循环并返回负数

这可行,但我的 SP 通常需要大约 20 秒才能运行,当我添加此功能时,它会增加大约 6.5 分钟的处理时间。

如果可能的话,我想要一种更有效的方法来做到这一点,但到目前为止我找不到更好的解决方案。

感谢所有帮助。

【问题讨论】:

  • 我猜想有一个数学解决方案 - 使用 log 函数。在 UDF 中有一个循环是导致您的问题的原因!
  • 为什么不直接使用@Cutoff / @hProb之类的东西?
  • 这个问题似乎是题外话,因为它需要一个代码审查。试试 codereview.stackexchange.com
  • 声明(@Result &lt; @tVal)中的@tVal是什么?应该是@CutOff 吗?正如 Kieren 所说,循环 100% 是你的问题,所以如果有人有创造性的方法来解决它而不用循环,那么你就是黄金。

标签: sql-server tsql optimization algebra


【解决方案1】:
select case
    when @hProb * @Cutoff <= @tVal then -1
    else floor(@tVal / @hProb)
end;

它可能会产生副作用,具体取决于参数的实际数据类型。

【讨论】:

  • 我认为截止值应该是 -1 而不是 @cutoff(在 then 子句中),但除此之外,是的,这个。
  • 谢谢...我只是在想整个事情...截止值只是一个安全阀,以防止循环持续太长时间,但地板(tval / hprob)确实如此我需要什么...非常感谢。
猜你喜欢
  • 2020-07-12
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2022-04-11
相关资源
最近更新 更多