获取使用SQL加倍的数字?

时间:2014-12-02 21:15:05

标签: sql postgresql logarithm

我试图计算一个数字(start_value)加倍的次数,直到它以尽可能最干净的方式达到特定值(end_value)。请考虑以下示例:

id   start_value    end_value

1     40              130
2     100             777
3     0.20            2.1


example 1: 40 * 2 = 80
           80 * 2 = 160
           160 = above value so therefore we had 2 doubles

example 2: 100 * 2 = 200
           200 * 2 = 400
           400 * 2 = 800
           800 = above value so we had 3 doubles

example 3: 0.20 * 2 = 0.4
           0.4 * 2  = 0.8
           0.8 * 2 = 1.6
           1.6 * 2 = 3.2
           3.2 = 4 doubles

4 个答案:

答案 0 :(得分:1)

你想要对数。具体而言,确切的次数是两个值的比率的log-of-base-2。你想要下一个更高的整数,所以你想要对它进行舍入。

在Postgres中:

ceiling(log(2, end_value / start_value))

答案 1 :(得分:1)

将结束值除以起始值以获得它们之间的因子。例如130/40 = 3.25。将值加倍一次得到因子2,将它加倍两次得到因子4,依此类推。

您可以使用基数2的对数来计算将值加倍以获得特定因子的次数。 log2(3.25)= 1.7004397 ...然后你将它向上舍入得到你需要加倍的整数次。

二进制对数可以计算为log(n)/ log(2):

select
  id,
  ceil(log(end_value / start_value) / log(2)) as times
from
  TheTable

演示:http://sqlfiddle.com/#!15/90099/4

答案 2 :(得分:0)

尝试以下SQL:

select id, start_value, end_value, floor(log(end_value / start_value,2)/2)
from TempTable

希望这有助于:)

答案 3 :(得分:0)

Postgres提供了log()的两种变体:Per documentation:

log(dp or numeric)
log(b numeric, x numeric)

具有两个参数的变体计算logarithm to base b。请注意:

  • 两个参数都需要numeric输入
  • 第一个参数是基础。

正确的表达方式是:

ceil(log(2.0, end_value::numeric / start_value::numeric)) AS times
  • 只有在您的列具有不同的数据类型时,才需要显式cat numeric
  • 输入基数为2.0而不是2,使其成为numeric而不是integer

SQL Fiddle.