Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необходимо найти два максимума из одного запроса / 7 сообщений из 7, страница 1 из 1
14.02.2003, 15:31
    #32106645
Jen
Jen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо найти два максимума из одного запроса

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


Предположим есть запрос возвращающий данные на основе нескольких таблиц необходимо из данного запроса найти два или более минимумов, максимумов или и то и другое (то есть максимум одного столбца и минимум значения для другого столбца). Например есть график посещения доктора распределенный по дням, часам, кабинетам. Необходимо найти наименьший день с наименьшим часом или с кабинетом имеющим статус наилучшего, но все это в одном запросе.
Нежелательно давать два или более запросов по причине их сложности и соответственно времени выполнения (хотя запросы одни и те же просто по очереди извлекаются разные максимумы).
Есть вариант открытия курсора и извелечения первого значения, до этого в запросе необходмо упорядочить нужном порядке значения. Но это опять-таки медленно. Пока откроется курсор.
Есть еще вариант с переменной rownum. Но при этом order by работает после нее и не имеет эффекта.
PL/SQl не позволяет задавать вложенные order. Вида ( .. order by ..) where rownum = 1.
В конесном итоге приходится делать или два или более запроса или открывать курсор.
Помогите у кого какие идеи!
...
Рейтинг: 0 / 0
14.02.2003, 15:58
    #32106658
[IPT]-Said
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо найти два максимума из одного запроса
Про доктора я честно говоря не понял, но тем не менее
select max(col1), min(col2), avg(col3),..... from <table>;
по моему просто...
...
Рейтинг: 0 / 0
14.02.2003, 16:50
    #32106708
UDW
UDW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо найти два максимума из одного запроса
А если вьюху создать? На составном запросе?
...
Рейтинг: 0 / 0
14.02.2003, 17:14
    #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
15.02.2003, 15:03
    #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
17.02.2003, 09:15
    #32107080
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо найти два максимума из одного запроса
См. http://www.sql.ru/faq/faq_topic.aspx?fid=132 Может подойдет подход к решению, но там рассматривается одна таблица.
...
Рейтинг: 0 / 0
17.02.2003, 11:26
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необходимо найти два максимума из одного запроса / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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