add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
SELECT ID, @cumu_return:=IF(id = 1, 1, @cumu_return + (@cumu_return * ret)) AS cumulative_return
FROM (
SELECT 1 AS ID, 1 AS num, 0.1 AS ret UNION ALL
SELECT 2 AS ID, 1 AS num, 0.1 AS ret UNION ALL
SELECT 3 AS ID, 1 AS num, 0.1 AS ret UNION ALL
SELECT 4 AS ID, 1 AS num, 0.1 AS ret UNION ALL
SELECT 5 AS ID, 1 AS num, 0.1 AS ret
) t cross join (select @cumu_return := 0) p
ID cumulative_return
1 1
2 1.1
3 1.2100000000000002
4 1.3310000000000002
5 1.4641000000000002
with daily_return as (
SELECT 1 AS id, 1 AS last_return, 0.1 AS daily_return, null as last_updated UNION ALL
SELECT 2 AS ID, 1 AS num, 0.1 AS ret, null UNION ALL
SELECT 3 AS ID, 1 AS num, 0.1 AS ret, null UNION ALL
SELECT 4 AS ID, 1 AS num, 0.1 AS ret, null UNION ALL
SELECT 5 AS ID, 1 AS num, 0.1 AS ret, null
)
SELECT id, last_updated,
(MAX(CASE WHEN id = 1 THEN last_return END) OVER (ORDER BY id) *
EXP(SUM(LN(1 + daily_return)) OVER (ORDER BY id)
) / (1 + daily_return)
) as cumulative_return
FROM daily_return c;
id last_updated cumulative_return
1 null 1
2 null 1.1
3 null 1.2100000000000002
4 null 1.3310000000000002
5 null 1.4641000000000004