Вместо группировки вы можете использовать аналитическую функцию lag()
, чтобы получить предыдущий статус для каждой строки в таблице A:
select HashKey,
QueueStatus,
lag(QueueStatus) over (partition by HashKey order by CreationDateTime) as PreviousQueueStatus
from tablea
, а затем использовать ее в качестве подзапроса (CTE или встроенное представление)и присоедините его к таблице B:
select b.HashKey, b.ReleaseStatus, b.TrxNo, a.PreviousQueueStatus
from tableb b
join (
select HashKey,
QueueStatus,
lag(QueueStatus) over (partition by HashKey order by CreationDateTime) as PreviousQueueStatus
from tablea
) a
on a.HashKey = b.HashKey
and a.QueueStatus = b.ReleaseStatus
where b.ReleaseStatus = 'SENT';
HASHKEY RELE TRX PREV
---------- ---- --- ----
1 SENT XYZ DEF
2 SENT XYZ MAN
Чтобы получить такой результат, я предположил, что время в вашей последней строке 2 / SENT в таблице A должно быть последним для этого HashKey, например, 02: 58, а не 01:58, поскольку это должно контролировать, какое другое значение вы видите.
db <> fiddle