Inclure uniquement les observations groupées lorsque l'ordre d'événement est valide

J'ai un tableau des dates pour les examens de la vue et les achats de lunettes pour les particuliers. Je veux seulement garder des cas où les individus ont acheté leurs lunettes après un examen de la vue. Dans l'exemple ci-dessous, je voudrais garder la personne 1, les events 2 et 3 pour la personne 2, la personne 3, mais pas la personne 4. Comment puis-je faire cela dans le server SQL?

| Person | Event | Order | | 1 | Exam | 1 | | 1 | Eyewear| 2 | | 2 | Eyewear| 1 | | 2 | Exam | 2 | | 2 | Eyewear| 3 | | 3 | Exam | 1 | | 3 | Eyewear| 2 | | 4 | Eyewear| 1 | | 4 | Exam | 2 | 

Le résultat final ressemblerait à

 | Person | Event | Order | | 1 | Exam | 1 | | 1 | Eyewear| 2 | | 2 | Exam | 2 | | 2 | Eyewear| 3 | | 3 | Exam | 1 | | 3 | Eyewear| 2 | 

L'auto-adhésion devrait fonctionner …

 select t.Person ,t.Event ,t.[Order] from yourTable t inner join yourTable t2 on t2.Person = t.Person and t2.[Order] = (t.[Order] +1) where t2.Event = 'Eyewear' and t.Event = 'Exam' 

Je n'ai pas essayé de l'optimiser mais cela semble fonctionner:

 create table t( person varchar(10), event varchar(10), [order] varchar(10) ); insert into t values ('1','Exam','1'), ('1','Eyewear','2'), ('2','Eyewear','1'), ('2','Exam','2'), ('2','Eyewear','3'), ('3','Exam','1'), ('3','Eyewear','2'), ('4','Eyewear','1'), ('4','Exam','2'); with xxx(person,event_a,seq_a,event_b,seq_b) as ( select a.person,a.event,a.[order],b.event,b.[order] from ta join tb on a.person = b.person and a.[order] < b.[order] and a.event like 'exam' and b.event like 'eyewear' ) select person,event_a event,seq_a [order] from xxx union select person,event_b event,seq_b [order] from xxx order by 1,3