2016-10-25 37 views
1

Question - Multiply previous rows SQL从以前的所有行中乘以数值

请参考上图。

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

元年必须被设置为值10以下将由乘法器​​乘10当年和往年于表1

对于示例中的值:

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

我会如何去做这件事?我会很感激任何帮助。

+0

哪个关系数据库管理系统/版本是你吗? –

+0

在哪个rdbms上? – Insac

+0

有了SQL Server,你可以使用'over partition' – Hackerman

回答

0

我的一位同事很早就教会了我使用对数特性来解决这类问题的技巧。

基本上,你可以这样做:

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 
+0

这样做只会让我获得去年想要的价值。 – jerbear

+0

谢谢!完美工作。 – jerbear

0
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