Нахождение N-го по старшинству значения. (II)
14 июня 2000 г.
Архив рекомендаций и кодов журнала Oracle Magazine, 30 января 1998, cod01308.html
Этот код прислал Atman Brahmachari, АБД компании Relational Technologies, Inc. в Manhattan Beach, штат California.
Если Вы используете Oracle7.3 или последующую версию, то для нахождения N-го по старшинству
значения можно применить более быстрое решение, чем предложенное в скрипте tipb1c8.html.
Использование индекса и указания (hint) делает его одним из наиболее быстрых решений подобного рода. Кроме того, что имеется входной параметр (&n), это решение позволяет Вам выбрать любой или даже
все столбцы строки таблицы. Этот запрос возвращает все строки, стоящие на N-м по старшинству месте,
которые, в свою очередь, могут быть отфильтрованы при использовании групповых функций
(например, avg()/max()/min()), и отобажена будет только одна строка.
Таким образом, требуется использование Oracle 7.3 или выше, программирование hint-указания 'index_desc' в запросе и существование индекса для анализируемого столбца.
/* Условная табица EMP */
create table emp
(empno number,
salary number )
/
/* Индекс, который используется в */
create index emp_sal on emp (salary)
/
/* Решение */
/*
Здесь мы имеем тривиальное (dummy) where-предложение, которое только обеспечивает выборку индекса и задействование hint-указания, гарантирующего, что используется именно индекс emp_sal
*/
select *
from emp
where
salary = (select /*+ index_desc(emp_sal) */ min(salary)
from emp
where salary > 0
and rownum <= &n
)
/
[Прим. редактора: Обычно я всегда проверяю подобные коды из “Опыта пользователей”. Часто приходится исправлять ошибки, опечатки, добавлять результаты выполнения. В данном случае я не стал вылизывать предлагаемое решение, предоставив это нашим читателям в качестве теста. А заодно хочу проверить, много ли наших читателей интересуются этой рубрикой. ]
|