|
|
|
Необходимо найти два максимума из одного запроса
|
|||
|---|---|---|---|
|
#18+
Необходимо найти два максимума из одного запроса Предположим есть запрос возвращающий данные на основе нескольких таблиц необходимо из данного запроса найти два или более минимумов, максимумов или и то и другое (то есть максимум одного столбца и минимум значения для другого столбца). Например есть график посещения доктора распределенный по дням, часам, кабинетам. Необходимо найти наименьший день с наименьшим часом или с кабинетом имеющим статус наилучшего, но все это в одном запросе. Нежелательно давать два или более запросов по причине их сложности и соответственно времени выполнения (хотя запросы одни и те же просто по очереди извлекаются разные максимумы). Есть вариант открытия курсора и извелечения первого значения, до этого в запросе необходмо упорядочить нужном порядке значения. Но это опять-таки медленно. Пока откроется курсор. Есть еще вариант с переменной rownum. Но при этом order by работает после нее и не имеет эффекта. PL/SQl не позволяет задавать вложенные order. Вида ( .. order by ..) where rownum = 1. В конесном итоге приходится делать или два или более запроса или открывать курсор. Помогите у кого какие идеи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2003, 15:31 |
|
||
|
Необходимо найти два максимума из одного запроса
|
|||
|---|---|---|---|
|
#18+
Про доктора я честно говоря не понял, но тем не менее select max(col1), min(col2), avg(col3),..... from <table>; по моему просто... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2003, 15:58 |
|
||
|
Необходимо найти два максимума из одного запроса
|
|||
|---|---|---|---|
|
#18+
А если вьюху создать? На составном запросе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2003, 16:50 |
|
||
|
Необходимо найти два максимума из одного запроса
|
|||
|---|---|---|---|
|
#18+
> Необходимо найти наименьший день с наименьшим часом Можно так попробовать : select a.maxday,max(a.time) as maxtime from (select max(day) as maxday,time from table group by time) a ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2003, 17:14 |
|
||
|
Необходимо найти два максимума из одного запроса
|
|||
|---|---|---|---|
|
#18+
Вот и я примерно о том же! Теперь по очереди: [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 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2003, 15:03 |
|
||
|
Необходимо найти два максимума из одного запроса
|
|||
|---|---|---|---|
|
#18+
См. http://www.sql.ru/faq/faq_topic.aspx?fid=132 Может подойдет подход к решению, но там рассматривается одна таблица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2003, 09:15 |
|
||
|
Необходимо найти два максимума из одного запроса
|
|||
|---|---|---|---|
|
#18+
Например, в 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 вот так, например вернётся макс. комиссионные при макс. зарплате ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2003, 11:26 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32107080&tid=1991804]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
148ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 468ms |

| 0 / 0 |
