2014-01-07 2 views
0

Я таблицу SQL с этой структуройTop 3 строки на основе оценки, но для обработки связей

Stud Name  Score 
--------------------- 
Alex   7 
John   5.6 
Tom   8.2 
Antony  6 
George  9 
Mathew  7 
Jim   5.5 

Мне нужно найти три лучших студентов на основе баллов.

Так что мой запрос

select top 3 * from studtable order by score desc 

Но поскольку существует связь нот для Алекса и Mathew, мы должны получить их обоих на конечный результат. Так как я могу справиться с этой ситуацией, когда галстук

ответ

0

Вы можете попробовать использовать подзапрос

select * from studtable 
where score in (select distinct top(3) score from studtable order by score desc) 
order by score desc 
+0

Boss это будет работать только в том случае, если в подзапросе есть отчет. Я сделал это сработало .. спасибо выберите * from studtable , где оценка в (выберите отличную верхнюю (3) оценку от контрольного списка по результату desc) заказать по счету desc –

+0

@sforsandeep: не могли бы вы проверить мое сообщение ?? –

+0

@sforsandeep, спасибо за исправление, ответ обновлен – Cris

1

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

select top 3 with ties * from studtable order by score desc 

Это будет получить вам топ 3, включая связи.

See it in Action

+0

Фактически наше требование i s, чтобы выбрать студентов с 3-мя отличными оценками. Но при использовании этого метода, если 3 ученика, имеющие одинаковый балл, говорят, что 9 из 10, другие ученики игнорируются. И, очевидно, мы не можем определить, кто второй и третий. Но в методе подзапроса он отобразит всех студентов, которые попадают в первую, вторую и третью позиции. Именно в этом сценарии. Извините, если мой вопрос вводит в заблуждение. –

1

Вы можете использовать сравнение в предложении where. Нечто подобное должно работать:

select top 3 * 
from studtable 
where score in (select top 3 score from studtable order by score desc) 
order by score desc; 

Это возвращает все строки с таким же счетом, как любой в топ-3, который, я думаю, что вы хотите. Если вы хотите, верхние 3 различных счетов:

where score in (select top 3 score from studtable group by score order by score desc) 

Альтернативный подход состоит в использовании функции ранжирования:

select st.* 
from (select st.*, dense_rank() over (order by score desc) as seqnum 
     from studtable 
    ) st 
where seqnum <= 3; 
+0

этот запрос вернет только 3 записи снова – Cris

+0

@Cris. , , На самом деле, я так не думаю. Он вернет верхние 3 оценки во внутреннем запросе. , , 9, 8.2 и 7. Затем он вернет четыре строки, которые имеют один из этих трех баллов. –

+1

@GordonLinoff: зачем использовать подзапрос или rank() sql-server может обрабатывать связи с 'with ties' ?? jus предложение сэр! –

0
select STA.* 
from studtable STA 
inner join (SELECT Top 3 Score from studtable ORDER BY Score DESC) STB 
on STA.Score = STB.Score 
order by STA.score desc 
0
select * from my_table where score in (select distinct score from my_table order by score desc limit 3) order by score desc; 
0

Вы можете рассмотреть возможность использования группы, прежде чем порядке // это также улучшит производительность

select top 3 * from studtable group by score order by score desc 
Смежные вопросы