CftClub.ru
Клуб специалистов ЦФТ-Банк

Аналитические ф-ции

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеПт Июл 10, 2015 11:28   Аналитические ф-ции Ответить с цитатой
Полезность: Нет оценки
Добрый день, как на sql (не PL+) написать запрос с аналитической ф-цией.
Есть такая, чтобы выбирала одно из значений таблицы по максимальному другому (тут дата)?
Например в таблице А 3 поля а1,а2,а3 в поле а3 дата, надо выбрать а2 но только ту, где а3 максимальна (последняя дата).

З.Ы. а аналитические для меня лес тёмный, никогда не работал с ними, а писать запрос чтобы выбирал максимальную дату, а потом значение по ней думаю и глупо и в разы дольше делаться будет на больших объёмах.
Damir
Участник - экстремал


Вступление в Клуб: 29.03.2013
СообщениеПт Июл 10, 2015 12:13   Re: Аналитические ф-ции Ответить с цитатой
Полезность: 2
yaffil пишет:

Например в таблице А 3 поля а1,а2,а3 в поле а3 дата, надо выбрать а2 но только ту, где а3 максимальна (последняя дата).


Код:
select max(a.a2) keep( dense_rank=first order by a.a3 desc)
  from A


yaffil пишет:
З.Ы. а аналитические для меня лес тёмный...

гугл в помощь - статей на русском языке предостаточно.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеПт Июл 10, 2015 12:39    Ответить с цитатой
Полезность: Нет оценки
first order by a.a3 desс
Специально так завернуто? Быстрее отработает чем LAST order by a.a3 ?
Damir
Участник - экстремал


Вступление в Клуб: 29.03.2013
СообщениеПт Июл 10, 2015 12:52    Ответить с цитатой
Полезность: Нет оценки
yaffil пишет:

...Быстрее отработает ...

уверяю - разницы не почувствуешь Smile

yaffil пишет:
first order by a.a3 desс
Специально так завернуто? ...чем LAST order by a.a3 ?


главное, чтобы правильно было Smile
наводящий вопрос: при сортировке по a.a3 где будут записи со значением null (вначале, в конце, в середине)?
Damir
Участник - экстремал


Вступление в Клуб: 29.03.2013
СообщениеПт Июл 10, 2015 13:15    Ответить с цитатой
Полезность: Нет оценки
Damir пишет:
наводящий вопрос: при сортировке по a.a3 где будут записи со значением null (вначале, в конце, в середине)?

правильно будет так
Код:
max(a.a2) keep(dense_rank first order by a.a3 desc nulls last) val2

или так
Код:
max(a.a2) keep(dense_rank last  order by a.a3 nulls first) val5     

но сортировка
Код:
order by .. nulls first
лично меня вгоняет в ступор, а 'nulls last' забываю писать Smile


погоняй тестовый примерчик
Код:

select --a.*
--       , dense_rank() over(order by a.a3 desc nulls last) rnk1
--       , dense_rank() over(order by a.a3) rnk2
       
        max(a.a2) keep(dense_rank first order by a.a3 desc) val1
       , max(a.a2) keep(dense_rank first order by a.a3 desc nulls last) val2
       , max(a.a2) keep(dense_rank last  order by a.a3 ) val3
       , max(a.a2) keep(dense_rank last  order by a.a3 nulls last ) val4
       , max(a.a2) keep(dense_rank last  order by a.a3 nulls first) val5                     
       
from(
select
  level as a1
  , mod(level, 10) a2
  , case
    when mod(level, 10) = 8 then to_date(null) 
    else sysdate + level
   end as a3   
 from dual
 connect by level <= 10
)a
order by a.a3 desc
--order by a.a3 desc nulls last
--order by a.a3 nulls last
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru