Получить последнюю запись для каждого TIMESTAMP

У меня есть этот запрос:

SELECT TIMESTAMP, 
       TIMESTAMP_OFFER, 
       TIMESTAMP_TRACK, 
       STATUS_ACPT 
FROM   TABLE1 
WHERE  TIMESTAMP IN 
(
    SELECT TIMESTAMP 
    FROM   TABLE2 
    WHERE  STATUS = '1' 
    AND    TIMESTAMP_PROCESSED BETWEEN 
            '2017-01-07-00.00.00.000000' 
        AND '2017-01-17-00.00.00.000000'
)

И результат:

    ---------------------------------------------------------------------------------------------------------
    | TIMESTAMP                  | TIMESTAMP_OFFER               | TIMESTAMP_TRACK            | STATUS_ACPT |
    ---------------------------------------------------------------------------------------------------------
    |2017-01-09 11:26:29.434254  | 2017-01-25 14:36:23.587199    | 2017-01-25 14:36:23.587199 | P           |
    ---------------------------------------------------------------------------------------------------------
    |2017-01-09 11:26:29.434254  | 2017-02-01 16:05:02.221179    | 2017-02-01 16:05:02.221179 | P           |
    ---------------------------------------------------------------------------------------------------------
    |2017-01-09 11:26:29.434254  | 2017-02-01 16:05:02.221179    | 2017-07-13 10:59:20.342584 | E           |
    ---------------------------------------------------------------------------------------------------------
    |2017-01-11 15:09:51.935322  | 2017-02-11 12:00:50.410959    | 2017-02-11 12:00:50.410959 | P           |
    ---------------------------------------------------------------------------------------------------------
    |2017-01-11 15:09:51.935322  | 2017-02-11 12:00:50.410959    | 2017-02-11 12:10:50.410959 | A           |
    ---------------------------------------------------------------------------------------------------------

Мне нужна последняя запись для каждого TIMESTAMP, я должен получить это:

    ---------------------------------------------------------------------------------------------------------
    | TIMESTAMP                  | TIMESTAMP_OFFER               | TIMESTAMP_TRACK            | STATUS_ACPT |
    ---------------------------------------------------------------------------------------------------------
    |2017-01-09 11:26:29.434254  | 2017-02-01 16:05:02.221179    | 2017-07-13 10:59:20.342584 | E           |
    ---------------------------------------------------------------------------------------------------------
    |2017-01-11 15:09:51.935322  | 2017-02-11 12:00:50.410959    | 2017-02-11 12:10:50.410959 | A           |
    ---------------------------------------------------------------------------------------------------------

Как мне это получить?

Как видите, TIMESTAMP и TIMESTAMP_OFFER могут иметь повторяющиеся значения, но TIMESTAMP_TRACK является уникальным.

1 ответ

Предполагая, что table1 является таблицей результатов, показанной выше, вы можете решить ее с помощью этого запроса:

with temp as (
select timestamp, timestamp_offer, timestamp_track, status_acpt,
       row_number() over (order by timestamp desc) as rownum_timestamp,
       row_number() over (order by timestamp_offer desc) as rownum_timestamp_offer
  from table1)
  select timestamp, timestamp_offer, timestamp_track
    from temp
   where rownum_timestamp = 1 or rownum_timestamp_offer = 1

Выражение Common Table используется для добавления rownumbers - по одному для каждого столбца метки времени, от которого требуется максимум, и в основной инструкции SQL извлекаются только строки с rownumber = 1. Обратите внимание на порядок сортировки - он по убыванию, так что rownumber 1 - это максимальная временная метка.

Другие вопросы по тегам