Как получить самую последнюю запись в базе данных для каждого идентификатора за день?

Я пытаюсь извлечь последнюю запись по идентификатору за день из таблицы базы данных, в которой база данных находится в Sybase SQL, а язык отчета, на котором написан запрос, - Oracle SQL. Я попытался смоделировать запрос после кода SQL, размещенного в другом месте на этом сайте, но он извлекает другие значения даты и времени, кроме max(). Я подозреваю, что причина в том, что некоторые поля, которые я использую, получены путем преобразования или обработки строк.

Вот запрос:

Select
    substring(x.Id, 1, datalength(x.Id) - datalength(x.TimeAndAction)) as 'Identification',
    x.City,
    x.Date,
    max (Convert(Varchar(15), x.UTCTime, 108)) as 'MaxTime'
        from db_table x
            where x.Date >= 20140401 
            and x.Date <= 20140403
            and x.City in ('LONDON', 'NEW_YORK', 'SHANGHAI', 'TOKYO')
            group by x.Id, x.City, x.Date

(ПРИМЕЧАНИЕ: идентификатор содержит местоположение как часть строки)

Проблема в том, что в вывод запроса также включаются более ранние времена (т. е. нежелательные данные). Как я могу это исправить?


person La-comadreja    schedule 18.08.2014    source источник
comment
база данных находится в Sybase SQL, а язык отчета, на котором написан запрос, — Oracle SQL не имеет никакого смысла. Вы не можете запустить Oracle SQL в базе данных Sybase. Что вы действительно используете? Оракл или Сибас? SQL в вашем вопросе определенно не подходит для Oracle.   -  person a_horse_with_no_name    schedule 18.08.2014
comment
Запрос находится в Sybase DB. Так что я бы использовал Sybase.   -  person La-comadreja    schedule 18.08.2014
comment
Sybase имеет 3 базы данных (ASE, ASA, IQ) с разным синтаксисом/функциями;)   -  person frlan    schedule 18.08.2014


Ответы (1)


Проблема заключалась в том, что GROUP BY основывался на идентификаторе, который был полем с уникальным значением в базе данных. Правильный результат появился, когда я заменил

group by x.Id

с

group by substring(x.Id, 1, datalength(x.Id) - datalength(x.TimeAndAction))
person La-comadreja    schedule 18.08.2014