I'd do :
data = [{'id' => 1, 'num' => 10},
{'id' => 1, 'num' => 5},
{'id' => 1, 'num' => 8},
{'id' => 2, 'num' => 0},
{'id' => 2, 'num' => 20},
{'id' => 2, 'num' => -5},
{'id' => 5, 'num' => 9},
{'id' => 5, 'num' => 9}]
data_grouped_ordered_by_num = data.group_by { |h| h['id'] }.sort_by { |_,v| v.map { |h| h['num'] }.max }.reverse
# => [[2, [{"id"=>2, "num"=>0}, {"id"=>2, "num"=>20}, {"id"=>2, "num"=>-5}]],
# [1, [{"id"=>1, "num"=>10}, {"id"=>1, "num"=>5}, {"id"=>1, "num"=>8}]],
# [5, [{"id"=>5, "num"=>9}, {"id"=>5, "num"=>9}]]]
data_grouped_ordered_by_num.map { |k,v| v.sort_by {|h| -h['num']} }
# => [[{"id"=>2, "num"=>20}, {"id"=>2, "num"=>0}, {"id"=>2, "num"=>-5}],
# [{"id"=>1, "num"=>10}, {"id"=>1, "num"=>8}, {"id"=>1, "num"=>5}],
# [{"id"=>5, "num"=>9}, {"id"=>5, "num"=>9}]]