Использовать условное агрегирование:
select day, hour,
sum( case when nums >= 0 and nums < 5 then 1 else 0 end ) as nums_0_5,
sum( case when nums >= 5 and nums < 10 then 1 else 0 end ) as nums_5_10,
. . .
from t
group by day, hour;
В Postgres суммы могут быть упрощены до:
count(*) filter (where nums >= 0 and nums < 5) as nums_0_5,
В MySQL:
sum( nums >= 0 and nums < 5 ) as nums_0_5,
РЕДАКТИРОВАТЬ:
Вы можете получить кумулятивные числа с помощью оконных функций и затем агрегировать:
select day, hour,
sum( case when cume_nums >= 0 and cume_nums < 5 then 1 else 0 end ) as nums_0_5,
sum( case when cume_nums >= 5 and cume_nums < 10 then 1 else 0 end ) as nums_5_10,
. . .
from (select t.*,
sum(nums) over (partition by um_no, date order by hour) as cume_nums
from t
) t
group by day, hour;