Любые две даты, так что первое и последнее посещения будут квалифицированы?
SELECT patient_id
FROM patient_visit
where visit_type in ('A', 'B', 'C')
group by patient_id
having count(*) >= 2 AND MAX(visit_date) - MIN(visit_date) >= 60
Если вы имели в виду последовательные, то
SELECT patient_id
FROM patient_visit
where visit_type in ('A', 'B', 'C')
AND EXISTS (
select *
from patient_visit v
where v.visit_type in ('A', 'B', 'C')
and v.patient_id = patient_visit.patient_id
and v.visit_date >= patient_visit.visit_date + 60)
AND NOT EXISTS (
select *
from patient_visit v2
where v2.visit_type in ('A', 'B', 'C')
and v2.patient_id = patient_visit.patient_id
and v2.visit_date > patient_visit.visit_date
and v2.visit_date < patient_visit.visit_date + 60)
group by patient_id
Это дорогой запрос, что-то вроде заказаO (N 3 ).Версия Oracle LAG может быть быстрее.