#sql #oracle
#sql #Oracle
Вопрос:
Я потратил последние 2 часа на поиск этого, и все, что я пробовал, не сработало. У меня есть table_Sessions, для которого я хочу вернуть идентификатор ветки и среднюю стоимость каждого сеанса. Но я хочу показать только верхние 2 средних значения.
Я буквально перепробовал все, с чем сталкивался. либо это не соответствует моему случаю, либо я неправильно его присвоил. В любом случае, я схожу с ума здесь.
Вот что у меня есть на данный момент, и, похоже, он выполняет около 80% того, что я хочу (последние 20% показывают только 2 самых высоких средних значения)
SELECT BRANCHID, AVG(SESSIONPRICE)
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC;
Если бы кто-нибудь, пожалуйста, сказал мне, как добавить к нему, я был бы очень признателен за это. Я использую Oracle SQL Developer.
Спасибо
Комментарии:
1. Что произойдет, если более 2 идентификаторов ветвей разделяют два верхних средних значения (sessionprice)? Вы все еще хотите отображать только 2 строки?
2. Да, но у меня нет такого случая
3. Если это вопрос домашнего задания, то это не такая уж большая проблема. Если это для отчетности производственной системы, то это становится более важным. Если вас действительно интересуют только первые две строки, и у вас есть случай, когда у вас есть 2 (или более), разделяющие одну из двух верхних средних цен сеанса, вас волнует, могут ли идентификаторы ветвей, сообщаемые вашим запросом, отличаться от запуска к запуску? Потому что, если вам не все равно, вам следует ввести дополнительные элементы в ваше предложение order by, чтобы гарантировать, что порядок исправлен при возникновении связей (иначе ничьих). Например.
ORDER BY AVG(SESSIONPRICE) DESC, branchid asc
Ответ №1:
SELECT (BRANCHID,AVGPRICE
FROM (SELECT BRANCHID, AVG(SESSIONPRICE) as AVGPRICE
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC)
WHERE rownum <= 2;
Ответ №2:
В более новых версиях Oracle (12c и выше) вы можете использовать Fetch First
, т.е.:
SELECT BRANCHID, AVG(SESSIONPRICE)
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC
FETCH FIRST 2 ROWS ONLY;
В более старых версиях вы можете использовать rownum
. Однако для этого нам нужно убедиться, что ваш порядок сначала оценивается, поэтому вам нужно поместить существующий запрос в вложенный запрос, а затем добавить к нему предложение WHERE для фильтрации rownum
.
Например:
SELECT * FROM
(SELECT BRANCHID, AVG(SESSIONPRICE)
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC) myQuery
WHERE rownum <= 2;
Смотрите https://www.techonthenet.com/oracle/questions/top_records.php для дальнейшего объяснения rownum.
Комментарии:
1. ДА. Второй пример: использование rownum сработало! Большое спасибо. Теперь, когда я это вижу, я должен был знать! Черт возьми. Еще раз спасибо!
Ответ №3:
Более поздние версии Oracle имеют FETCH FIRST
:
SELECT BRANCHID, AVG(SESSIONPRICE)
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC
FETCH FIRST 2 ROWS ONLY
Для более старых версий Oracle используйте ROWNUM
. Вероятно, что-то вроде:
select * from
(
SELECT BRANCHID, AVG(SESSIONPRICE)
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC
) dt
WHERE ROWNUM <= 2
Комментарии:
1. разве у oracle не было rownum? вот так:
WHERE ROWNUM <= 2
2. Это дает мне сообщение о том, что «команда SQL не завершилась должным образом», начиная со строки и строки
FETCH FIRST
3. Похоже, ваша версия Oracle слишком стара для ПЕРВОЙ ВЫБОРКИ. Вместо этого проверьте rownum.
4. @jarlh я думаю, вы должны включить
;
в конце5. @jarlh Я также проверил rownum, и каждый раз, когда он выдает мне ошибку «Group By» или «order by»
Ответ №4:
Используйте команду SQL LIMIT, чтобы ограничить количество результатов или SQL TOP, если не используется MySQL.
Оба делают одно и то же.
Используйте команду SQL LIMIT, чтобы ограничить количество результатов или SQL TOP, если не используется MySQL.
Оба делают одно и то же.
с помощью TOP
SELECT TOP 2 BRANCHID, AVG(SESSIONPRICE)
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC;
Ответ №5:
ОБНОВЛЕНО
SELECT *
FROM
(SELECT BRANCHID,
AVG(SESSIONPRICE)
FROM SESSIONS
GROUP BY BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC FETCH FIRST 2 ROWS ONLY)
WHERE rownum <= 2;
Ссылка:
Комментарии:
1. Это выдает ошибку «SQL неправильно завершен». Начиная со строки
FETCH FIRST
2. @RobBor: проверьте этот запрос