Я второе мнение Гэри о модели данных, но это не имеет отношения к вопросу.
Это одно из возможных решений.Вероятно, это будет довольно эффективно, если для FRUIT_ID много потенциальных значений и этот столбец проиндексирован.
select apple.cust_id
from
( select c.cust_id, min(s.sale_date) as sale_date
from cust c
join sales s
on s.transaction_id = c.transaction_id
where s.fruit_id = 'CHERRY'
group by c.cust_id ) cherry
,
( select c.cust_id, min(s.sale_date) as sale_date
from cust c
join sales s
on s.transaction_id = c.transaction_id
where s.fruit_id = 'APPLE'
group by c.cust_id ) apple
where cherry.cust_id = apple.cust_id
and cherry.sale_date > apple.sale_date
/
Если значений FRUIT_ID меньше, тогда вариант с предложением Гари, вероятно, будет более эффективным:
select cust_id
from
( select c.cust_id
, min(case when s.fruit_id = 'CHERRY' = s.sale_date else null end) as cherry_date
, min(case when s.fruit_id = 'APPLE' = s.sale_date else null end) as apple_date
from cust c
join sales s
on s.transaction_id = c.transaction_id
group by c.cust_id ) cherry
where cherry_date > apple_date
/
Предостерегающий лектор: у меня в настоящее время нет доступав базу данных, поэтому эти операторы не проверены и могут иметь синтаксические ошибки.Я проверю их, когда смогу.