Контроль результата запроса оракула - PullRequest
0 голосов
/ 04 января 2012

У меня есть такая схема

 create table sample(id number ,name varchar2(30),mark number);

Теперь я должен вернуть имена трех верхних марок. Как я могу написать SQL-запрос для этого?

Если я использую max (отметка) , он вернет только максимум и

  select name from sample 

возвращает все имена !! Я пытался разными способами, но я не смог контролировать результат до 3 строк .. Пожалуйста, предложите способ избавиться от моей проблемы ..

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Как вы хотите справиться с галстуками? Если Мэри получает оценку 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, поскольку предикат применяется до упорядочения.

0 голосов
/ 04 января 2012
SELECT t2.name FROM
(
SELECT t.*, t.rownum rn
FROM sample t
ORDER BY mark DESC
) t2
WHERE t2.rn <=3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...