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