Запрет функции Max использовать временную метку как часть критерия в столбце даты в PL / SQL - PullRequest
1 голос
/ 08 июня 2011

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

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')

1 Ответ

3 голосов
/ 08 июня 2011

В 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)
...