Cześć, mam oto taki problem.
Jest sobie tabela:

DER
------------
employeeID
startDate
name --nazwisko pracownika
eventDate --data i godzina wejścia lub wyjścia
btnCode -- dla ułatwienia załóżmy, że jest to zdefiniowany wcześniej typ wyjścia(papieros, przerwa, etc)
isOut -- czy jest to wyjście(1), czy wejście

Teraz mając tą tabelę, muszę osiągnąć taki, w którym widoczne będą wyjścia i czas, jaki pracownik spędził poza pracą:

employeeID
startDate
name
eventDate -- godzina wyjścia
btnCode -- typ wyjścia (np. papieros, przerwa, etc)
back --godzina powrotu
diff --czas, jaki pracownik spędził poza pracą, czyli w uproszczeniu: back - eventDate

Napisałem coś takiego:

 
select outs.employeeID, outs.startDate, outs.name, outs.eventDate, outs.btnCode, ins.eventDate as back, 
	datediff(ss, outs.eventDate, ins.eventDate) as diff
from 
( 
	select * 
	from der  
	where isOut = 1 and btnCode is not null 
-- tu mam jeszcze kilka warunków ograniczających, nie są one w tym problemie ważne
) as outs 
left join 
( 
	select * 
	from der
	where isOut = 0 
) as ins on ins.employeeID = outs.employeeID 
	and ins.startDate = outs.startDate and ins.eventDate>outs.eventDate 

Teoretycznie to działa :)

Niestety, jeśli mamy taki przypadek(wejścia i wyjścia - wycinek tabeli DER):

EmployeeID|  eventDate  |   btnCode   |   isOut
-----------------------------------------------------
1         |  14:07:00   |     4     |     1
1         |  14:10:00   |     0     |     0
1         |  14:11:00   |     4     |     1
1         |  14:14:00   |     0     |     0

widok zadziała źle.

Będą widoczne 3 wyjścia o typie 4, a to ze względu na warunek joina: ins.eventDate>outs.eventDate

Próbowałem dać w inlineTable ins top1 (select TOP 1 *...), ale wtedy w ogóle nie było powrotów. Jak to poprawić?