Если transaction_id
всегда меньше POWER(2,64)
, то вы, похоже, находите максимум message_sequence
для самых последних run_number
и transaction_id
, и вы можете записать его, используя аналитические функции как:
Настройка Oracle :
CREATE TABLE persons ( person_id, run_number, transaction_id, message_sequence, status ) AS
SELECT 'L1001001', 1, 1, 1, 1 FROM DUAL UNION ALL
SELECT 'L1001001', 1, 2, 2, 1 FROM DUAL UNION ALL
SELECT 'L1001001', 2, 1, 3, 1 FROM DUAL UNION ALL
SELECT 'L1001001', 2, 2, 5, 1 FROM DUAL UNION ALL
SELECT 'L1001001', 2, 3, 4, 1 FROM DUAL;
Запрос :
SELECT *
FROM (
SELECT p.*,
MAX( message_sequence )
KEEP ( DENSE_RANK LAST ORDER BY run_number, transaction_id )
OVER ( PARTITION BY person_id )
AS message_for_max_rn_ti,
MAX( message_sequence )
OVER ( PARTITION BY person_id )
AS max_message_sequence
FROM persons p
WHERE person_id = 'L1001001'
AND ( run_number < 2497
OR ( run_number = 2497 AND transaction_id < 172 ) )
)
WHERE message_sequence = max_message_sequence
AND status != 2;
Вывод :
PERSON_ID | RUN_NUMBER | TRANSACTION_ID | MESSAGE_SEQUENCE | STATUS | MESSAGE_FOR_MAX_RN_TI | MAX_MESSAGE_SEQUENCE
:-------- | ---------: | -------------: | ---------------: | -----: | --------------------: | -------------------:
L1001001 | 2 | 2 | 5 | 1 | 4 | 5
дБ <> скрипка здесь