Не самый элегантный, пожалуй.
DROP TABLE IF EXISTS T;
create table t
(id int, b_id int, amount int, side int);
insert into t values
(1 , 1 , 500 , 1),
(2 , 1 , 900 , 1),
(3 , 1 , 600 , 1),
(4 , 1 , 300 , 1),
(5 , 2 , 400 , 1),
(6 , 2 , 500 , 1),
(7 , 2 , 800 , 1),
(8 , 2 , 100 , 1);
select t.*,
case when id = maxid then amt
else amount
end as amount
from t
left join
(
select b_id,sum(amount) amt from t where id <> (select max(id) from t t1 where t1.b_id = t.b_id)
group by b_id
) s on s.b_id = t.b_id
left join
(select b_id,max(id) maxid from t group by b_id) a on a.b_id = t.b_id
+------+------+--------+------+--------+
| id | b_id | amount | side | amount |
+------+------+--------+------+--------+
| 1 | 1 | 500 | 1 | 500 |
| 2 | 1 | 900 | 1 | 900 |
| 3 | 1 | 600 | 1 | 600 |
| 4 | 1 | 300 | 1 | 2000 |
| 5 | 2 | 400 | 1 | 400 |
| 6 | 2 | 500 | 1 | 500 |
| 7 | 2 | 800 | 1 | 800 |
| 8 | 2 | 100 | 1 | 1700 |
+------+------+--------+------+--------+
8 rows in set (0.003 sec)