Ich würde eine Fensterfunktion verwenden:
select *
from (
select u.*, dense_rank() over (order by balance desc) as rnk
from users u
) t
where rnk = 2;
Ich glaube nicht, dass es einen großen Leistungsunterschied zu Ihrer Abfrage geben wird (insbesondere nicht mit einem Index auf balance
), aber meiner Meinung nach ist es einfacher zu lesen und zu pflegen.