2016-10-05 3 views
-1

Я пытаюсь отобразить только две верхние строки в Oracle, однако мне не удалось найти что-либо, что работает.Выберите две верхние строки в Oracle

настоящее время у меня

SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE) 
FROM BRANCH, SESSIONS 
WHERE SESSIONS.BRANCHID = BRANCH.BRANCHID 
GROUP BY BRANCHNAME, BRANCH.BRANCHID 
ORDER BY AVG(SESSIONPRICE) DESC 

который возвращает этот

B2  A  18.67 
B4  B  17.57 
B3  C  15.44 
B1  D  13.99 

Однако, я хочу только две верхние строки этой таблицы.

Как я это делаю?

+0

'выборки первые 2 строки only' https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#BABBADDD –

+1

Вы пробовали [поиск] (http: //stackoverflow.com/questions/470542/how-do-i-limit-the-number-of-rows-returned-by-an-oracle-query-after-ordering)? – Aleksej

+0

Да, у меня есть, и я не смог найти решение, я изучал SQL всего 2 недели. Так много этого я не понимаю. –

ответ

-1

Я снова ответ отредактированы:

SELECT * 
FROM (SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE) 
FROM BRANCH, SESSIONS 
WHERE SESSIONS.BRANCHID = BRANCH.BRANCHID 

GROUP BY BRANCHNAME, BRANCH.BRANCHID 
ORDER BY AVG(SESSIONPRICE) DESC 
) 
WHERE ROWNUM <= 2; 
+0

Это не будет работать должным образом. Подробнее см. В руководстве: https://docs.oracle.com/database/121/SQLRF/pseudocolumns009.htm#SQLRF00255 –

+0

Удивительно, большое вам спасибо, отредактированный работает отлично. Большое спасибо! –

+0

Особая благодарность a_horse_with_no_name за помощь. –

-2

Использование RowNum:

Он используется, чтобы указать количество записей, возвращаемых.

  SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE) 
      FROM BRANCH, SESSIONS 
      WHERE 
      ROWNUM <= 2 and SESSIONS.BRANCHID = BRANCH.BRANCHID 
      GROUP BY BRANCHNAME, BRANCH.BRANCHID 
      ORDER BY AVG(SESSIONPRICE) DESC ; 
+0

Я пробовал это, но меняет значения в третьей строке. Вы знаете, почему это так? –

0

С Oracle 9i и далее, RANK() и DENSE_RANK() могут быть использованы для определения TOP N строк. Примеры:

Получить верхнюю 2 филиала с использованием RANK()

SELECT ename, sal 
    FROM (SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE) RANK() OVER (ORDER BY AVG(SESSIONPRICE) DESC) avg_rank 
      FROM BRANCH) 
WHERE avg_rank<= 2; 

Получить верхнюю 2 филиала с использованием DENSE_RANK()

SELECT ename, sal 
    FROM (SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE) DENSE_RANK() OVER (ORDER BY AVG(SESSIONPRICE) DESC) avg_Dense_rank 
      FROM BRANCH) 
WHERE avg_Dense_rank<= 2; 
+0

Теперь я просто получаю сообщение об ошибке «ОТ Ключевого слова не найдено, где ожидалось» –

+0

обновил мои анны, проверьте его сейчас. –

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

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