2017-11-13 6 views
2

Ich habe eine Tabelle mit Daten für Augenuntersuchungen und Augenschutzkäufe für Einzelpersonen. Ich möchte nur Instanzen aufbewahren, in denen Menschen ihre Augen nach einer Augenuntersuchung gekauft haben. Im Beispiel unten möchte ich Person 1, Ereignisse 2 und 3 für Person 2, Person 3, aber nicht Person 4 behalten. Wie kann ich dies in SQL Server tun?Nur gruppierte Beobachtungen, bei denen die Ereignisreihenfolge gültig ist

| 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 | 

Das Endergebnis wie

funktionieren sollte es versucht hätte aussehen
| Person | Event | Order | 
| 1 | Exam | 1 | 
| 1 | Eyewear| 2 | 
| 2 | Exam | 2 | 
| 2 | Eyewear| 3 | 
| 3 | Exam | 1 | 
| 3 | Eyewear| 2 | 
+0

Erwartete Ergebnisse bitte. – Sami

+0

@Sami Oops, hinzugefügt! –

+0

ist es * sofort * gefolgt von der Prüfung oder kann es zu einem späteren Zeitpunkt sein? –

Antwort

1

Selbst beitreten ...

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' 
+0

Das ist perfekt, danke! Ich habe gerade die Bedingung für den Beitritt zu t2 [Bestellen]> t [Auftrag] geändert, um Situationen zu berücksichtigen, in denen sie nach einer Augenuntersuchung mehr als eine Brille bekommen haben. –

+0

genial @EmmaSmith froh, dass es funktioniert – scsimon

+0

Aaaa, ich weiß nicht, was passiert, aber aus irgendeinem Grund wird der Code nur Prüfungen zurückgeben. –

0

ich nicht zu optimieren, aber das scheint zu funktionieren:

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 t a join t b 
     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 
Verwandte Themen