Du kan bruge en subselect eller CTE til at få dataene bestilt af medarbejder og bruge dem som hoveddatatabel. Noget lignende (tilpas det om nødvendigt) til dette:
;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
Forklaring:Den 'bestilte' CTE viser medarbejderens ind-/udgange sorteret efter dato. ROW_NUMBER
nulstilles for hver medarbejder (jeg antager, at emp_reader_id indeholder medarbejder-id'et) på grund af PARTITION BY
.
Når jeg har fået tælleren for hver medarbejder, tilslutter jeg hvert slag for hver medarbejder (første betingelse i venstre join) med det næste slag for den pågældende medarbejder (anden betingelse i venstre join). På den måde kan jeg vise indtastningskolonnen og udgangen (det næste slag).
Efter du har fået ind- og ud-kolonnerne i dine data, vil du måske udelukke nogle data (de ulige rækker for hver medarbejder er de rækker, du ønsker) ved at tilføje WHERE entered.OrderedPunch %2 = 1