Du kan använda en subselect eller CTE för att få uppgifterna beställda av anställda och använda den som huvuddatatabell. Något liknande (anpassa det vid behov) till detta:
;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
Förklaring:Den "beställda" CTE visar personalens in-/utträde ordnade efter datum. ROW_NUMBER
återställs för varje anställd (jag antar att emp_reader_id innehåller anställd-id) på grund av PARTITION BY
.
När jag väl fått räknaren för varje anställd slår jag ihop varje stämpel för varje anställd (första villkoret i den vänstra kopplingen) med nästa stämpling för den anställde (andra villkoret i den vänstra kopplingen). På så sätt kan jag visa ingångskolumnen och utgången (nästa slag).
Efter att du fått in- och utkolumnerna i dina data kanske du vill utesluta vissa data (de udda raderna för varje anställd är de rader du vill ha) och lägga till WHERE entered.OrderedPunch %2 = 1