Как вы хотите справиться с галстуками? Если Мэри получает оценку 100, Том получает оценку 95, а Джон и Дейв оба получают оценку 90, какие результаты вы хотите, например? Вы хотите, чтобы и Джон, и Дейв вернулись, поскольку они оба были на третьем месте? Или вы хотите выбрать один из двух, чтобы результат всегда имел ровно три строки? Что произойдет, если Бет также сыграет вничью с результатом 95? Ты все еще считаешь Джона и Дейва связанными за третье место или ты считаешь их за четвертое место?
Вы можете использовать аналитические функции, чтобы получить N результатов, хотя выбор аналитической функции зависит от того, как вы хотите разрешить связи.
SELECT id,
name,
mark
FROM (SELECT id,
name,
mark,
rank() over (order by mark desc) rnk
FROM sample)
WHERE rnk <= 3
вернет три верхние строки, используя аналитическую функцию RANK
, чтобы ранжировать их по MARK
. RANK
возвращает одинаковое звание для людей, которые связаны и использует стандартный спортивный подход для определения вашего звания, так что если два человека побеждают за второго, следующий участник занимает четвертое место, а не третье. DENSE_RANK
гарантирует, что числовые ранги не будут пропущены, поэтому, если два человека связывают вторую, следующий ряд будет третьим. ROW_NUMBER
присваивает каждой строке различный ранг путем произвольного разрыва связей.
Если вы действительно хотите использовать ROWNUM
вместо аналитических функций, вы также можете сделать
SELECT id,
name,
mark
FROM (SELECT id,
name,
mark
FROM sample
ORDER BY mark DESC)
WHERE rownum <= 3
Однако вы не можете иметь предикат ROWNUM
на том же уровне, что и предложение ORDER BY
, поскольку предикат применяется до упорядочения.