Yo usaría una función de ventana:
select *
from (
select u.*, dense_rank() over (order by balance desc) as rnk
from users u
) t
where rnk = 2;
No creo que haya una gran diferencia de rendimiento en su consulta (especialmente no con un índice en balance
) pero en mi opinión es más fácil de leer y mantener.