В MySQL 8+ вы можете сделать:
select t.*,
sum(change) over (order by date) as cumulative
from t;
В более ранних версиях я рекомендовал бы коррелированный подзапрос:
select t.*,
(select sum(t2.change) from t t2 where t2.date <= t.date) as cumulative
from t;
Это будет работать в представлении и может занятьпреимущество индекса на (date, change)
.
Эта версия, вероятно, не так эффективна, как использование переменных в более старых версиях MySQL, но она должна быть лучше, чем решение join
/ group by
.