【问题标题】:Recursive multiplication in SQL ServerSQL Server 中的递归乘法
【发布时间】:2022-01-05 17:02:59
【问题描述】:

我有两个价值观。如何将第一个值乘以第二个值,然后将乘法的结果再次乘以第一个数字,然后再将结果乘以第一个数字,依此类推?这样的重复次数例如7次

我有两列 A 和 B。

  • 答:1.65
  • 乙:10

我需要在结果列中这样的结果:

结果:

16,5, 27,2, 44,9, 74,1, 122,2, 201,7, 332,9

所以乘法是:

1.65 * 10 = 16,5
1.65 * 16,5 = 27,2
1.65 * 27,2 = 44,9
etc...

我想我应该使用递归查询,但我不知道如何编写它我正在使用 SQL Server。

【问题讨论】:

  • 这不就是求幂吗?在您的示例中,对于 1 到 7 之间的 n,您将获得 10 * 1.65^n。如果是这样,则无需递归。

标签: sql sql-server recursion


【解决方案1】:

递归解

with CTE as (
  select 
   1.65 as val1,
   10 as val2
)
, RCTE as (
  select val1, val2, 1 as lvl
  , cast(val1*val2 as decimal(38,16)) as result 
  , cast(power(val1, 1)*val2 as float) as result2
  from CTE
  union all
  select val1, val2, lvl+1
  , cast(val1*result as decimal(38,16))
  , cast(power(val1, lvl+1)*val2 as float) 
  from RCTE
  where lvl < 7
)
select *
from RCTE
GO
val1 | val2 |等级 |结果 |结果2 ---: | ---: | --: | -------------------: | ------: 1.65 | 10 | 1 | 16.5000000000000000 | 16.5 1.65 | 10 | 2 | 27.2250000000000000 | 27.2 1.65 | 10 | 3 | 44.9212500000000000 | 44.9 1.65 | 10 | 4 | 74.1200625000000000 | 74.1 1.65 | 10 | 5 | 122.2981031250000000 | 122.3 1.65 | 10 | 6 | 201.7918701562500000 | 201.8 1.65 | 10 | 7 | 332.9565857578125000 | 333

db小提琴here

【讨论】:

  • 非常感谢!
  • 谢谢。现在有了力量。
【解决方案2】:
1.65(1.65(1.65*10)) = (1.65*1.65*1.65)*10 = 1.65^3 * 10

7 次重复

select power(1.65,7) * 10

【讨论】:

  • 想法相同。
  • 谢谢。是的,我将能够得到最后的结果 332.9。但是我如何获得所有的中间值呢?
  • 加入计数表以提供 0、1、2、3、4、5 的幂。
【解决方案3】:

如果您想为每个连续值生成多行,您可以尝试:

with
n as (
  select 1 as i, cast(10.0 as float) as v
 union all
  select i + 1, v * 1.65 from n where i < 10
)
select v from n order by i

结果:

 v                
 ---------------- 
 10               
 16.5             
 27.225           
 44.92125         
 74.1200625       
 122.298103125    
 201.79187015625  
 332.956585757812 
 549.37836650039  
 906.474304725644 

请参阅db<>fiddle 的运行示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多