Выбрать последнюю запись с конца (+)

Новичок_я
Дата: 30.11.2009 09:35:54
Всем, привет!

Наверняка этот вопрос поднимался неоднократно, но в поиске не нашел :(
Необходимо получить первую запись с конца выборки (разумеется, после сортировки)

select date_r from table where rownum = 1 order by date_r desc

возвращает все равно первую запись (с сортировкой по date_r asc), т.к. rownum все равно высчитывается так, как будто сортировка была order by date_r asc.

Мигрирую с SQL Server'a, поэтому и не силен в подобном :(
Вопрос: можно ли сделать это без подзапроса?
Спасибо!
__vvp_
Дата: 30.11.2009 09:41:25
Новичок_я,

В данном случае MAX(date_r) не устроит?
Новичок_я
Дата: 30.11.2009 09:42:26
Нет, т.к. помимо поля date_r есть еще поля. Фактически, необходимо выбрать поля для максимальной даты
__vvp_
Дата: 30.11.2009 09:54:16
Новичок_я,

Почитайте
Возврат части отсортированной выборки

Еще может помочь (без подзапросов) GROUP BY FIRST/LAST
DENIS_PR
Дата: 30.11.2009 10:15:27
Обернуть этот запрос и оттуда уже смотреть на rownum
DENIS_PR
Дата: 30.11.2009 10:18:10
DENIS_PR,
пардон, проглядел про "без подзапроса"
GKirill
Дата: 30.11.2009 10:54:00
Новичок_я
Всем, привет!

Наверняка этот вопрос поднимался неоднократно, но в поиске не нашел :(
Необходимо получить первую запись с конца выборки (разумеется, после сортировки)

select date_r from table where rownum = 1 order by date_r desc

возвращает все равно первую запись (с сортировкой по date_r asc), т.к. rownum все равно высчитывается так, как будто сортировка была order by date_r asc.

Мигрирую с SQL Server'a, поэтому и не силен в подобном :(
Вопрос: можно ли сделать это без подзапроса?
Спасибо!

вроде, должно помочь
select max(date_r) date_r,
       max(field1) keep(dense_rank first order by date_r desc) field1
  from table
Добрый Э - Эх
Дата: 30.11.2009 11:38:41
Новичок_я
Вопрос: можно ли сделать это без подзапроса?
Ответ: можно. Но как тут любят спрашивать: а чем же подзапрос не устроил?
Добрый Э - Эх
Дата: 30.11.2009 11:45:41
Как вариант (замена подзапроса на JOIN):
select t0.*
  from TABLE t0
  left join TABLE t1
    on t0.date_r < t1.date_r
 where t1.date_r is null;
suPPLer
Дата: 30.11.2009 12:37:55
Добрый Э - Эх
Как вариант (замена подзапроса на JOIN):
select t0.*
  from TABLE t0
  left join TABLE t1
    on t0.date_r < t1.date_r
 where t1.date_r is null;


Н-да, замена ORDER BY STOPKEY + COUNT STOPKEY в плане на пару сортировок + какой-нибудь JOIN, чтобы получить неэквивалентный в общем случае запрос - это достойная цена за боязнь подзапросов у ТС. :)

PS: Никто ведь вроде не говорил, что date_r - уникально...
PPS: ТС,
select * from (select * from ... order by date_r) where rownum = 1