Один метод использует коррелированный подзапрос:
select t.*
from t
where t.id >= (select max(t2.id)
from t t2
where t2.user = t.user and t2.type = 'good'
);
Это должно иметь хорошую производительность, если у вас есть индекс на (user, type, id)
.
Исходя из формулировки вашего вопроса, я интерпретировать это как требующий хотя бы одного хорошего ряда. Если это не так, то можно использовать следующие логики c:
select t.*
from t
where t.id >= all (select t2.id
from t t2
where t2.user = t.user and t2.type = 'good'
);
Вы также можете использовать оконные функции:
select t.*
from (select t.*,
max(case when type = 'good' then id end) over (partition by user) as max_good_id
from t
) t
where id >= max_good_id;