【问题标题】:SQL Multiply values from all previous rowsSQL 将所有先前行的值相乘
【发布时间】:2016-10-25 17:11:56
【问题描述】:

参考上图。

我有表 1,我想用 SQL 生成表 2。

必须将第一年的值设置为 10。下面的值将乘以 10 乘以表 1 中该年和前几年的乘数。

例如:

  • 对于 2002,该值将为 10 * 2(2002 乘数)* 1(2001 乘数)= 20。
  • 对于 2005 年,该值为 10 * 5 * 3 * 1 * 2 * 1(所有上一年乘数)= 300。

我该怎么做呢?我会很感激任何帮助。

【问题讨论】:

标签: mysql sql multiplication


【解决方案1】:

我的一个同事很久以前就教过我一个技巧,用对数性质解决这类问题。

基本上你可以这样做:

 Exp(sum(ln(multiplier)))

在 OP 让我意识到它不完整之后编辑

要执行您需要的累积逻辑,您应该将其应用于自联接

 select a.youryear, Exp(sum(ln(b.multiplier))) cumulative_mutiplier
   from yourtable as a 
        join
        yourtable as b on a.youryear>=b.youryear
  group by a.youryear;

我已经在rextester上准备了一个测试

 create table yourtable (
      youryear integer,
      multiplier integer
  );

  insert into yourtable(youryear,multiplier) values (2000,10);
  insert into yourtable(youryear,multiplier) values (2001,1);
  insert into yourtable(youryear,multiplier) values (2002,2);
  insert into yourtable(youryear,multiplier) values (2003,1);
  insert into yourtable(youryear,multiplier) values (2004,3);
  insert into yourtable(youryear,multiplier) values (2005,5);

   select a.youryear, Exp(sum(ln(b.multiplier))) cumulative_mutiplier
     from yourtable as a 
         join
         yourtable as b on a.youryear>=b.youryear
   group by a.youryear; 

结果是:

    youryear    cumulative_mutiplier
 1  2000    10
 2  2001    10
 3  2002    20
 4  2003    20
 5  2004    60
 6  2005    300

【讨论】:

  • 这样做只会让我获得去年想要的价值。
  • 谢谢!!完美运行。
【解决方案2】:
select      year
           ,x
           ,@result := @result*coalesce(x,10) as result

from        table1,(select @result:=1) i

order by    year
;

# year, x, result
2000, , 10
2001, 1, 10
2002, 2, 20
2003, 1, 20
2004, 3, 60
2005, 5, 300

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2011-04-12
    • 2022-09-26
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多