Есть несколько способов сделать это, я предлагаю вам попробовать их все и посмотреть, какой из них оптимален для вас
drop table if exists t;
create table t(
id int, transaction_code varchar(10), order_code varchar(10), create_time date, status varchar(10));
insert into t values
(1 , 'TR001' , 'OC001' , '2019-04-16' , 'Fail'),
(2 , 'TR001' , 'OC001' , '2019-04-18' , 'Success'),
(3 , 'TR002' , 'OC001' , '2019-04-16' , 'Fail'),
(4 , 'TR003' , 'OC001' , '2019-04-16' , 'success');
select t.*
from t
left join t t1 on t1.transaction_code = t.transaction_code and t1.status = 'Success'
where t1.status is null;
select *
from t
where status = 'FAIL' and
not exists (select 1 from t t1 where t1.transaction_code = t.transaction_code and status = 'Success');
select *
from t
where t.transaction_Code not in(
select transaction_code from t t1
where t1.transaction_code = t.transaction_code and status = 'Success'
);
+------+------------------+------------+-------------+--------+
| id | transaction_code | order_code | create_time | status |
+------+------------------+------------+-------------+--------+
| 3 | TR002 | OC001 | 2019-04-16 | Fail |
+------+------------------+------------+-------------+--------+
1 row in set (0.00 sec)