Я бы сделал это как анти-объединение:
select *
from table a
where not exists (
select null
from table b
where
a.customer_id = b.customer_id and
b.pay_type = 'late'
)
Это имеет преимущества по сравнению с отличным или непринятым подходом в том, что он перестанет смотреть после того, как найдет совпадение.Это должно работать эффективно как для больших, так и для небольших наборов данных.
Любое решение, использующее различные, должно будет оценить весь набор данных, а затем удалить дубликаты.