Użyłbym funkcji okna:
select *
from (
select u.*, dense_rank() over (order by balance desc) as rnk
from users u
) t
where rnk = 2;
Nie sądzę, że będzie duża różnica w wydajności twojego zapytania (szczególnie nie z indeksem balance
) ale moim zdaniem jest to łatwiejsze do odczytania i utrzymania.