2013-09-25 3 views
0

Будут говорить, что у меня есть таблица базы данных с помощью следующих двух записей:Выберите запись с максимальной Датой создания

CACHE_ID BUSINESS_DATE CREATED_DATE 
1183  13-09-06  13-09-19 16:38:59.336000000 
1169  13-09-06  13-09-24 17:19:05.762000000 
1152  13-09-06  13-09-17 14:18:59.336000000 
1173  13-09-05  13-09-19 15:48:59.136000000 
1139  13-09-05  13-09-24 12:59:05.263000000 
1152  13-09-05  13-09-27 13:28:59.332000000 

Мне нужно написать запрос, который будет возвращать cache_id для записи, которая имеет самый последнее ДАТА СОЗДАНИЯ.

У меня возникли проблемы с созданием такого запроса. Я могу сделать GROUP BY на основе BUSINESS_DATE и получить MAX (CREATED_DATE) ... конечно, у меня не будет CACHE_ID записи.

Может кто-нибудь помочь в этом?

ответ

2

не положительна на синтаксисе оракула, но использовать ROW_NUMBER() функцию:

SELECT BUSINESS_DATE, CACHE_ID 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY BUSINESS_DATE ORDER BY CREATED_DATE DESC) RN 
     FROM YourTable t 
    )sub 
WHERE RN = 1 

ROW_NUMBER() функция присваивает номер каждой строки. PARTITION BY не является обязательным, но используется для начала нумерации для каждого значения в этой группе, то есть: если вы PARTITION BY BUSINESS_DATE, то для каждого уникального значения BUSINESS_DATE нумерация начнется с 1. ORDER BY, конечно, используется для определения того, как должен идти счет, и требуется в функции ROW_NUMBER().

+0

Этот ответ выглядит многообещающим. Я попробую. Благодарю. – timmy

+0

Это решение работает. Я изменил запрос для работы с Oracle. – timmy

+0

Я попытался отредактировать комментарий, но редактирование, похоже, было отклонено. Концептуально это будет работать, но синтаксис не будет работать на Oracle 11g. – timmy

0

Не уверен в точном синтаксисе, но концептуально, вы не можете просто сортировать по CREATED_DATE по убыванию и взять первый?

+0

Мне не нужна только первая запись со всей таблицы. Я думаю, что пример плох. У меня может быть несколько записей за ту же дату. Для каждой деловой даты мне нужна самая последняя запись. Я обновлю пример. – timmy

0

Во всех записях -

select top 1 CACHE_ID from YourTable order by CREATED_DATE desc 

Для каждого BUSINESS_DATE -

select distinct 
a.BUSINESS_DATE, 
(
    select top 1 b.CACHE_ID 
    from YourTable b where a.BUSINESS_DATE = b.BUSINESS_DATE 
    order by b.CREATED_DATE desc 
) as Last_CREATED_DATE 
from YourTable a 
+0

TOP не является корректным оператором в Oracle. Кроме того, мне не нужен максимальный идентификатор кеша. Мне нужен самый последний идентификатор кеша, указанный CREATED_DATE. – timmy

1

Вы хотите группы на сегодняшний день бизнеса и получить cache_id с самым текущей датой создания? Используйте примерно следующее:

select yt.CACHE_ID, yt.BUSINESS_DATE, yt.CREATED_DATE 
from YourTable yt 
where yt.CREATED_DATE = (select max(yt1.CREATED_DATE) 
          from YourTable yt1 
          where yt1.BUSINESS_DATE = yt.BUSINESS_DATE) 
Смежные вопросы