powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необходимо найти два максимума из одного запроса
7 сообщений из 7, страница 1 из 1
Необходимо найти два максимума из одного запроса
    #32106645
Jen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jen
Гость

Необходимо найти два максимума из одного запроса


Предположим есть запрос возвращающий данные на основе нескольких таблиц необходимо из данного запроса найти два или более минимумов, максимумов или и то и другое (то есть максимум одного столбца и минимум значения для другого столбца). Например есть график посещения доктора распределенный по дням, часам, кабинетам. Необходимо найти наименьший день с наименьшим часом или с кабинетом имеющим статус наилучшего, но все это в одном запросе.
Нежелательно давать два или более запросов по причине их сложности и соответственно времени выполнения (хотя запросы одни и те же просто по очереди извлекаются разные максимумы).
Есть вариант открытия курсора и извелечения первого значения, до этого в запросе необходмо упорядочить нужном порядке значения. Но это опять-таки медленно. Пока откроется курсор.
Есть еще вариант с переменной rownum. Но при этом order by работает после нее и не имеет эффекта.
PL/SQl не позволяет задавать вложенные order. Вида ( .. order by ..) where rownum = 1.
В конесном итоге приходится делать или два или более запроса или открывать курсор.
Помогите у кого какие идеи!
...
Рейтинг: 0 / 0
Необходимо найти два максимума из одного запроса
    #32106658
[IPT]-Said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про доктора я честно говоря не понял, но тем не менее
select max(col1), min(col2), avg(col3),..... from <table>;
по моему просто...
...
Рейтинг: 0 / 0
Необходимо найти два максимума из одного запроса
    #32106708
UDW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если вьюху создать? На составном запросе?
...
Рейтинг: 0 / 0
Необходимо найти два максимума из одного запроса
    #32106729
Фотография Filippova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Необходимо найти наименьший день с наименьшим часом

Можно так попробовать :

select a.maxday,max(a.time) as maxtime
from
(select max(day) as maxday,time
from table
group by time) a
...
Рейтинг: 0 / 0
Необходимо найти два максимума из одного запроса
    #32106886
Jen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jen
Гость
Вот и я примерно о том же!
Теперь по очереди:
[IPT]-Said select max(col1), min(col2), avg(col3),..... from <table>;
Проблема в следующем max или min выбираются из всех строк запроса, то есть к примеру у нас recordset
1 2
2 1
тогда будет возвращаться значение при min 1 1, хотя такой записи нет.

UDW Спасибо за совет,я использую примерно тот же способ. Он есть в вопросе! Проблема со временем выполнения - это довольно быстро если таблица одна, а у меня их 5-6 (в одном запросе). View тоже не решает проблемы. Откровенно говоря пробовал, не намного быстрее. В принципе выполняется за 10-15 секунд, но у меня обращений к запросу 1000-1500, а снизить его использование не представляется возможным. Есть еще один вариант с созданием динамических массивов. Но это опять таки зависит от количества возвращаемых строк. Если 500-700 то он врят ли применим.
Решить можно многими способами. Проблема в том что все они довольно медленные. Т.к требуют ненужных вычислений. Дин. массивы, курсоры - забирают много памяти, вложенные запросы слишком долго работают (хотя у ORACLE и есть механизмы по кешированию часто используемых запросов)

Filippova
Вполне рабочий вариант, спасибо за совет!
Нет никаких идей по возможному возвращению только одной строки из запроса после упорядочивания,что-нибудь вроде rownum ?
...
Рейтинг: 0 / 0
Необходимо найти два максимума из одного запроса
    #32107080
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. http://www.sql.ru/faq/faq_topic.aspx?fid=132 Может подойдет подход к решению, но там рассматривается одна таблица.
...
Рейтинг: 0 / 0
Необходимо найти два максимума из одного запроса
    #32107176
Фотография hinotf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, в 9i

SELECT deptno, max(comm) KEEP (DENSE_RANK FIRST ORDER BY zp) "Max"
from emp
group by deptno

вернёт максимальный коммисионные для того, у кого минимальная зарплата
KEEP (DENSE_RANK FIRST ORDER BY zp) - здесь происходит "сортировка" по зарплата, по умолчанию по-возрастанию, следовательно префикс FIRST вернёт минимальную


SELECT max(comm) KEEP (DENSE_RANK LAST ORDER BY zp) "Min"
from emp
group by deptno

вот так, например вернётся макс. комиссионные при макс. зарплате
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необходимо найти два максимума из одного запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]