Получить последнюю запись для каждого 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 - это максимальная временная метка.