Как я могу получить следующий вывод? - PullRequest
0 голосов
/ 23 ноября 2010
table = emp

SAL
------
8000
7000
6000
5000
10000
9000
4000
8000
7000

Для приведенной выше таблицы напишите оператор SELECT, чтобы отобразить наибольшие и вторые по величине цены.Ваш вывод должен быть следующим: -

          first     second
         -------    --------
           10000     9000

я написал следующий запрос, но получил следующий вывод:

select sal from (select rownum first, sal from(select distinct sal from emp1       order by sal desc))where first <= 2;

вывод:

 SAL
----- 
10000  
9000

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Другой способ - использовать функцию DENSE_RANK; также, если вы избегаете MIN / MAX, вы можете получить любые произвольные значения Nth по мере необходимости:

with q as (
  select sal, dr from (
    select distinct
           sal
          ,DENSE_RANK() OVER (ORDER BY sal DESC) dr
    from   emp
  ) where dr in (1,2,10)
)
select (select sal from q where dr = 1) first
      ,(select sal from q where dr = 2) second
      ,(select sal from q where dr = 10) tenth
from dual;

Запрос (q) должен быть материализован, чтобы его многочисленные запросы не приводили к дополнительным проходам через данные.

1 голос
/ 23 ноября 2010

Затем выберите минимальное и максимальное значение из вашего собственного запроса в два отдельных столбца.

with   i
as     ( select sal
           from ( select rownum first
                       , sal
                    from ( select distinct sal
                             from scott.emp
                            order by sal desc ) )
          where first <= 2 )
select min ( i.sal )
     , max ( i.sal )
  from i
 group by i.sal;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...