That should have been
update tbl
set volume = (select avg(b.volume) from tbl b where b.hr=tbl.hr-1 or b.hr=tbl.hr+1)
where volume = 0
This is too simplistic however, but it may suit your needs. It is simplistic because:
If your first hour has 0, it will copy the value directly from the next hour since there is no data prior.
If you have two or more consecutive zeroes, you will end up with some low valued data. See this example of before/after.
Hr / Before / after
0 / 10 / 10
1 / 0 / 5
2 / 0 / 0
3 / 0 / 15
4 / 30 / 30
5 / 10 / 10
6 / 0 / 15
7 / 20 / 20