Предотвращение использования функции Max отметки времени как части критериев в столбце даты в PL/SQL

Если я запрашиваю:

select max(date_created) date_created

в поле даты в PL/SQL (Oracle 11g), и есть записи, созданные в один и тот же день, но в разное время, Max() возвращает только самое последнее время на эту дату. Я хотел бы, чтобы время игнорировалось и возвращало ВСЕ записи, соответствующие максимальной дате, независимо от связанной с ними временной метки в этом столбце. Какова наилучшая практика для этого?

Изменить: я хочу вернуть все записи за самую последнюю дату, которая соответствует моим критериям, независимо от различных временных меток на этот день. Ниже показано, что я делаю сейчас, и он возвращает записи только с последней даты И времени этой даты.

    SELECT r."ID",
    r."DATE_CREATED"
  FROM schema.survey_response r
  JOIN
    (SELECT S.CUSTOMERID ,
      MAX (S.DATE_CREATED) date_created
    FROM schema.SURVEY_RESPONSE s
    WHERE S.CATEGORY IN ('Yellow', 'Blue','Green')
    GROUP BY CUSTOMERID
    ) recs
  ON R.CUSTOMERID    = recs.CUSTOMERID
  AND R.DATE_CREATED = recs.date_created
  WHERE R.CATEGORY  IN ('Yellow', 'Blue','Green')

Окончательное редактирование: все заработало с помощью приведенного ниже запроса.

SELECT r."ID",
    r."DATE_CREATED"
  FROM schema.survey_response r
  JOIN
    (SELECT S.CUSTOMERID ,
      MAX (trunc(S.DATE_CREATED)) date_created
    FROM schema.SURVEY_RESPONSE s
    WHERE S.CATEGORY IN ('Yellow', 'Blue','Green')
    GROUP BY CUSTOMERID
    ) recs
  ON R.CUSTOMERID    = recs.CUSTOMERID
  AND trunc(R.DATE_CREATED) = recs.date_created
  WHERE R.CATEGORY  IN ('Yellow', 'Blue','Green')

person userDrew    schedule 07.06.2011    source источник
comment
КАТА база данных - КАКАЯ версия .....   -  person marc_s    schedule 08.06.2011
comment
MAX всегда возвращает одно скалярное значение (поэтому игнорирование части поля даты и времени, не относящейся к дате, не имеет значения). Попробуйте обновить сообщение, чтобы задать реальный вопрос, например, как выбрать все записи за последний день? (Или что уместно - это знание также приведет к улучшению поиска SO, поскольку этот вопрос довольно распространен.)   -  person    schedule 08.06.2011
comment
Приношу свои извинения, требуется дополнительная информация. На самом деле это запрос PL/SQL, и да, мне нужно выбрать все записи за самый последний день. Это для Oracle 11g. Добавлены теги.   -  person userDrew    schedule 08.06.2011


Ответы (1)


В Oracle вы можете получить самую последнюю дату, игнорируя время

SELECT max( trunc( date_created ) ) date_created
  FROM your_table

Вы можете получить все строки с самой последней датой, игнорируя время, несколькими способами. Использование аналитических функций (предпочтительно)

SELECT *
  FROM (SELECT a.*,
               rank() over (order by trunc(date_created) desc) rnk
          FROM your_table a) 
 WHERE rnk = 1

или более традиционный, но менее эффективный

SELECT *
  FROM your_table
 WHERE trunc(date_created) = (SELECT max( trunc(date_created) )
                                FROM your_table)
person Justin Cave    schedule 07.06.2011
comment
Вернул 0 записей, когда я подключил первый блок к своему запросу. Я боюсь даже пытаться понять, как включить 2-й и 3-й блоки в мой запрос. SELECT r."ID", r."DATE_CREATED" FROM schema.survey_response r JOIN (SELECT S.CUSTOMERID , MAX (S.DATE_CREATED) date_created FROM schema.SURVEY_RESPONSE s WHERE S.CATEGORY IN ('Yellow', 'Blue','Green') GROUP BY CUSTOMERID ) recs ON R.CUSTOMERID = recs.CUSTOMERID AND R.DATE_CREATED = recs.date_created WHERE R.CATEGORY IN ('Yellow', 'Blue','Green') - person userDrew; 08.06.2011
comment
Получил работу! Я забыл обернуть trunc() вокруг моих критериев соединения для r.date_created, чтобы он совпадал с усечением, которое я делал с операцией Max(). Обновили окончательный рабочий запрос в моем исходном вопросе. Спасибо!! - person userDrew; 08.06.2011