Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Функция dense_rank  [new]
hum_i
Member

Откуда:
Сообщений: 570
Добрый день!. Мне нужно вытащить данные 10 последних звонков абонента, где бы все данные ранжировались согласно этому. Т.е. логический вызов, стоимость звонка. Запрос вытащил максимальную дату, но вот стоимость и логический вызов он берет не по последним звонкам а по первым. Можете подсказать что не так в запросе?

select *
  from (select subs_subs_id,
               lcal_lcal_id,
               def as logic_name,               
               max(max_t) keep(dense_rank last order by max_t) over(partition by subs_subs_id) as max_t,
               dense_rank() over(partition by subs_subs_id order by max_t) r
          from (select c.subs_subs_id, c.lcal_lcal_id, lc.def, c.in_balance_$, c.start_time as max_t                                             
                  from calls_022011 c,
                         logic_calls lc
                 where c.lcal_lcal_id = lc.lcal_id
                   and c.subs_subs_id = 145467
                   and c.in_balance_$ > 0)) cl
 where r < 11
29 мар 11, 13:54    [10439027]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
hum_i,

order by max_t
29 мар 11, 13:55    [10439039]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
order by max_t desc
29 мар 11, 13:58    [10439064]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
hum_i
Member

Откуда:
Сообщений: 570
Ничего не изменилось
select *
  from (select subs_subs_id,
               lcal_lcal_id,
               def as logic_name, 
               in_balance_$,             
               max(max_t) keep(dense_rank last order by max_t) over(partition by subs_subs_id) as max_t,
               max(max_t) keep(dense_rank last order by max_t) over(partition by lcal_lcal_id) as cdf,
               dense_rank() over(partition by subs_subs_id order by max_t) r
          from (select c.subs_subs_id, c.lcal_lcal_id, lc.def, c.in_balance_$, c.start_time as max_t                                             
                  from calls_022011 c,
                         logic_calls lc
                 where c.lcal_lcal_id = lc.lcal_id
                   and c.subs_subs_id = 145467
                   and c.in_balance_$ > 0)
                   order by max_t
        ) cl
 where r < 11
29 мар 11, 14:18    [10439267]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
а я думал иногда головой полезно не только есть.
уже всё разжёвано дальше некуда. а так?:
dense_rank() over(partition by subs_subs_id order by max_t DESC) r
29 мар 11, 14:19    [10439278]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
hum_i
Member

Откуда:
Сообщений: 570
Вы извините просто я эту функцию что то в толк не возьму. Вот сейчас он мне выдал последний вызов под первым рангом
select *
  from (select subs_subs_id,
               lcal_lcal_id,
               def as logic_name, 
               in_balance_$,          
               max(max_t) keep(dense_rank last order by max_t) over(partition by subs_subs_id) as max_t,
               dense_rank() over(partition by subs_subs_id order by max_t DESC) r
          from (select c.subs_subs_id, c.lcal_lcal_id, lc.def, c.in_balance_$, c.start_time as max_t                                             
                  from calls_00_022011 c,
                         logic_calls lc
                 where c.lcal_lcal_id = lc.lcal_id
                   and c.subs_subs_id = 145467
                   and c.in_balance_$ > 0)) cl
 where r < 11
29 мар 11, 14:36    [10439432]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
hum_i
Member

Откуда:
Сообщений: 570
А должен ведь присвоить последнему вызову самый высокий ранг
29 мар 11, 14:38    [10439445]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
какую из тех что Вы в запросе поналяпали Вы не поймёте?
думаю вам нужен вот такой результат:
select *
  from (select cl.*,
               dense_rank() over(partition by subs_subs_id order by max_t DESC) r
          from (select c.subs_subs_id, c.lcal_lcal_id, lc.def, c.in_balance_$, c.start_time as max_t                                             
                  from calls_00_022011 c,
                         logic_calls lc
                 where c.lcal_lcal_id = lc.lcal_id
                   and c.subs_subs_id = 145467
                   and c.in_balance_$ > 0)) cl
 where r < 11
если я угадал, то внимательно читать про аналитику и работу оконных функций.
29 мар 11, 14:40    [10439466]     Ответить | Цитировать Сообщить модератору
 Re: Функция dense_rank  [new]
hum_i
Member

Откуда:
Сообщений: 570
Все теперь понятно спасибо.
29 мар 11, 14:57    [10439620]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить