Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Выбрать значение предыдущее максимальному  [new]
!_-_-_-_!
Guest
Есть набор даннных
num
1
3
2
Максимальное значение 3, как можно выбрать предшествующую ему 2

Есть вариант
with t as ( 
      select 1 num from dual
      union all
      select 3 num from dual
      union all
      select 2 num from dual
     )
select max(num)
from t where t.num < (select max(num) from t)
но не нравится два прохода по таблице
12 июн 09, 14:30    [7293985]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
ILoveCoffee
Member

Откуда: Astana
Сообщений: 986
!_-_-_-_!,
ы ?
WITH t AS (
SELECT 1 a FROM dual UNION ALL
SELECT 2 a FROM dual UNION ALL
SELECT 4 a FROM dual UNION ALL
SELECT 4 a FROM dual UNION ALL
SELECT 5 a FROM dual UNION ALL
SELECT 22 a FROM dual UNION ALL
SELECT 444 a FROM dual UNION ALL
SELECT 6 a FROM dual UNION ALL
SELECT 11 a FROM dual UNION ALL
SELECT 5 a FROM dual UNION ALL
SELECT 6 a FROM dual UNION ALL
SELECT 4 a FROM dual UNION ALL
SELECT 3 a FROM dual
)SELECT a , nvl(lag(max(a)) over (ORDER BY a),0)
FROM t
GROUP BY a
12 июн 09, 14:41    [7294010]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
И ещё парочку...
-- 1
with t as ( 
      select 1 num from dual
      union all
      select 3 num from dual
      union all
      select 2 num from dual
     )
select num 
  from (select num
          from (select num from t order by num desc)
         where rownum < 3
         order by num)
 where rownum = 1;
-- 2
with t as ( 
      select 1 num from dual
      union all
      select 3 num from dual
      union all
      select 2 num from dual
     )
select num 
  from (select num, row_number() over(order by num desc) rn from t)
 where rn = 2;
12 июн 09, 14:42    [7294014]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
потенциальный эмигрант
Member

Откуда:
Сообщений: 147
если иднекс на поле есть, то двух проходов по таблице не будет

также можно как-то так
select * from (select o.num, dense_rank() over (order by o.num desc) rn from O )t
where t.rn = 2 and rownum = 1
12 июн 09, 14:45    [7294030]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
потенциальный эмигрант
Member

Откуда:
Сообщений: 147
suPPLer
И ещё парочку...

студент с тобой двойку схлопочет
если будет несколько максимальных значений
12 июн 09, 14:46    [7294033]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
Elic
Member

Откуда:
Сообщений: 29979
suPPLer
where rownum < 3
where row_number() = 2;
5,5,5,5,4,4,4,3,3,3,2,1 :)
12 июн 09, 14:46    [7294034]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Elic, потенциальный эмигрант

вот ведь вы вредные, сразу про несколько строк с максимальным значением... Ну почему от ТС вопросов и примеров таких не дождёшься, а? А я вот ждал, надеялся...

PS:
+
-- 1
with t as ( 
      select 1 num from dual
      union all
      select 3 num from dual
      union all
      select 3 num from dual
      union all
      select 2 num from dual
     )
select num 
  from (select num
          from (select num from t group by num order by num desc) -- и тут тоже... :(
         where rownum < 3
         order by num)
 where rownum = 1;
-- 2
with t as ( 
      select 1 num from dual
      union all
      select 3 num from dual
      union all
      select 2 num from dual
     )
select num 
  from (select num, row_number() over(order by num desc) rn from t group by num ) -- что спросит/сам добавит, надеялся... :(
 where rn = 2;
12 июн 09, 14:58    [7294071]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
shtirlitz56
Member

Откуда: Красноярск
Сообщений: 100
with t as ( 
      select 1 num from dual
      union all
      select 3 num from dual
      union all
      select 3 num from dual
      union all
      select 2 num from dual
     )
select num 
  from (select num, dense_rank() over(order by num desc) rn from t)
where rn = 2;
12 июн 09, 16:01    [7294228]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
shtirlitz56,

а если ещё одну двоечку добавим, то вернётся ли значениЕ, предыдущее максимальному?
PS: Возьмите набор данных Elic'а, там оба подвоха сразу.
12 июн 09, 16:11    [7294255]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
shtirlitz56
Member

Откуда: Красноярск
Сообщений: 100
suPPLer, да, с ещё одной двоечкой некрасиво получилось, переделал:
with t as ( 
      select 1 num from dual
      union all
      select 3 num from dual
      union all
      select 3 num from dual
      union all
      select 2 num from dual
            union all
      select 2 num from dual
     )
select num 
  from (select num, dense_rank() over(order by num desc) rn from t)
where rn = 2 and rownum=1;
12 июн 09, 16:20    [7294280]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
shtirlitz56,

и Вы не поверите, но Вас опередили...
12 июн 09, 16:22    [7294287]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
shtirlitz56
Member

Откуда: Красноярск
Сообщений: 100
suPPLer, вообще есть подозрение что любое из представленных решений на форуме раз 10 уже засветилось, а ссылка не работает кстати :)
12 июн 09, 16:33    [7294309]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
shtirlitz56
Member

Откуда: Красноярск
Сообщений: 100
эмигранту привет, только щас заметил повтор...
12 июн 09, 16:35    [7294315]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
shtirlitz56,

там чутка выше потенциальный эмигрант давал такое же решение... А с ссылкой - да, это мне время от времени ФФ "помогает", извиняюсь.
12 июн 09, 16:36    [7294316]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
УмныйЧеловек
Member

Откуда:
Сообщений: 244
Эта задача типа вопроса для интервью. Я бы даже сказал, что задачка классическая на знания БД. Для решения надо смотреть в сторону следующего запроса:
Select * From Employee E1 Where
(2-1) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where
E2.Salary > E1.Salary)
Если сможете сообразить, как это работаете, то можете идти в дибиэи.
Удачи!
12 июн 09, 21:57    [7294884]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать значение предыдущее максимальному  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
УмныйЧеловек
Эта задача типа вопроса для интервью. Я бы даже сказал, что задачка классическая на знания БД. Для решения надо смотреть в сторону следующего запроса:
Select * From Employee E1 Where
(2-1) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where
E2.Salary > E1.Salary)
Если сможете сообразить, как это работаете, то можете идти в дибиэи.
Удачи!


буа-га-га. имхо, красить заборы - в самый раз. только вывих мозга вылечить заранее..
15 июн 09, 10:20    [7298778]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить