U kunt een subselectie of CTE gebruiken om de gegevens per werknemer te bestellen en deze als hoofdgegevenstabel te gebruiken. Iets soortgelijks (pas het indien nodig aan) hierop:
;with ordered as (
select
emp_reader_id as empId,
CONVERT(DATE, dt) as Punch,
Row_number()
OVER (PARTITION BY emp_reader_id ORDER BY CONVERT(DATE, dt) ASC) as OrderedPunch
from trnevents
)
SELECT
entered.empId,
entered.Punch as PunchIn,
exited.Punch as PunchOut
from
ordered as entered
left join ordered as exited on
entered.empId = exited.empId
and entered.OrderedPunch + 1 = exited.OrderedPunch
Toelichting:De 'bestelde' CTE toont wel de in- en uitstroom van de werknemer geordend op datum. De ROW_NUMBER
wordt gereset voor elke werknemer (ik neem aan dat de emp_reader_id de werknemer-ID bevat) vanwege de PARTITION BY
.
Zodra ik de teller voor elke werknemer heb, voeg ik elke stoot voor elke werknemer (eerste voorwaarde in de linker join) toe aan de volgende stoot voor die werknemer (tweede voorwaarde in de linker join). Op die manier kan ik de ingangskolom en de uitgang (de volgende stoot) laten zien.
Nadat u de in- en uitkolommen in uw gegevens hebt gekregen, wilt u misschien enkele gegevens uitsluiten (de oneven rijen van elke werknemer zijn de rijen die u zou willen) door WHERE entered.OrderedPunch %2 = 1
toe te voegen