简体   繁体   中英

Calculate a specific moving average using sql query

Consider that I have a table with one column "A" and I would like to create another column called "B" such that

B[i] = 0.2*A[i] + 0.8*B[i-1]

where B[0]=0 .

My problem is that I cannot use the OVER() function because I want to use the values in B while I am trying to construct B. Any idea would be appreciated. Thanks

This is a rather complex mathematical exercise. You want to accumulate exponentially decreasing amounts from previous rows.

It is a little confusing because the amount going in on each row is 20%, but that is just a factor in the formula.

In any case, this seems to do what you want:

select t.*,
       sum(power(0.8, -n) * a * 0.2) over (order by id) / power(0.8, -n)
from (select t.8,
             row_number() over (order by id) - 1 as n
      from t
     ) x;

Here is a db<>fiddle using Postgres.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM