2016-08-23 1 views
2

По таблицам:Второе наибольшее значение из таблицы БД Oracle в

USERS (user_name, email, balance) 

Как я могу создать запрос, вернуть второй самый высокий баланс пользователя в наиболее эффективным способом?

I успехи, чтобы получить эту запись (но не эффективным способом) с запросом:

SELECT 
    * 
FROM 
    (SELECT 
    us.*, 
    ROWNUM row_num 
    FROM 
    (SELECT 
     u.* 
    FROM 
     users u 
    ORDER BY 
     u.BALANCE DESC) us 
    WHERE 
    ROWNUM < 3) 
WHERE 
    row_num > 1; 
+0

Вы можете получить некоторое представление от http://stackoverflow.com/questions/38990303/display-city- with-second-most-number-of-stores-in-sql/38990690 # 38990690 –

+0

Что вы хотите вернуть, если существуют связи для самого высокого значения? –

+1

Ваш код в порядке, если у вас есть указатель на 'users (Balance)'. –

ответ

1

Попробуйте это:

SELECT * 
FROM (SELECT * 
     FROM USERS 
     ORDER BY balance DESC 
     FETCH FIRST 2 ROWS ONLY 
    ) 
ORDER BY balance DESC 
FETCH FIRST 1 ROWS ONLY 
+0

Это круто, но только в 12c. – vercelli

+1

Вы правы, отредактированы! –

+1

Было бы неплохо сравнить эти 2 метода. Вероятно, это быстрее. – vercelli

3

Я хотел бы использовать функцию окна:

select * 
from (
    select u.*, dense_rank() over (order by balance desc) as rnk 
    from users u 
) t 
where rnk = 2; 

Не думаю, что в вашем запросе будет большая разница в производительности (особенно с индексом balance), но, на мой взгляд, его легче читать и поддерживать.

+0

предложение: вместо dense_rank() лучше использовать row_number() – Aishu

+0

@Aishu: но это не приведет к возвращению нескольких пользователей с тем же самым балансом, который является вторым по величине. Он будет возвращать только одного пользователя, даже если есть другой с тем же самым (вторым самым высоким) балансом. –

0

Это должно работать даже в случае, если более чем один пользователь, имеющий тот же 2-й по величине баланс ..

select * from USERS where balance IN 
    (select max(balance) 
    from (select balance from USERS 
    where balance NOT IN (select max(balance) from USERS)) 
); 

 Смежные вопросы

  • Нет связанных вопросов^_^