2016-10-25 3 views
1

Question - Multiply previous rows значения SQL-Умножить из всех предыдущих строк

Обратитесь к изображению выше.

У меня есть таблица 1, и я хочу создать таблицу 2 с SQL.

Первый год должен быть установлен на значение 10. Значения следующих умножит 10 умножителем на этот год и предыдущие годы в таблице 1.

Например:

  • В 2002 году , значение будет 10 * 2 (множитель 2002 года) * 1 (коэффициент 2001 года) = 20.
  • В течение 2005 года значение будет 10 * 5 * 3 * 1 * 2 * 1 (все множители предыдущего года) = 300 .

Как мне это сделать? Буду признателен за любую помощь.

+0

Какой RDMS/версия вы? –

+0

На каких rdbms? – Insac

+0

С SQL Server вы можете использовать 'over partition' – Hackerman

ответ

0

Мой коллега давно научил меня хитрости решить такие проблемы, используя свойства логарифма.

В принципе вы можете сделать:

Exp(sum(ln(multiplier))) 

Отредактировано после того, как ОП заставил меня понять, что было неполным

Для кумулятивного логики вам нужно, вы должны применить это на автообъединение

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