Sie könnten eine Unterauswahl oder CTE verwenden, um die Daten nach Mitarbeitern sortiert zu erhalten und sie als Hauptdatentabelle zu verwenden. Etwas Ähnliches (gegebenenfalls anpassen) zu diesem:
;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
Erläuterung:Der „geordnete“ CTE zeigt die Eintritte/Austritte der Mitarbeiter nach Datum geordnet an. Die ROW_NUMBER
wird für jeden Mitarbeiter zurückgesetzt (ich nehme an, dass die emp_reader_id die Mitarbeiter-ID enthält) wegen der PARTITION BY
.
Sobald ich den Zähler für jeden Mitarbeiter erhalten habe, verbinde ich jeden Schlag für jeden Mitarbeiter (erste Bedingung in der linken Verknüpfung) mit dem nächsten Schlag für diesen Mitarbeiter (zweite Bedingung in der linken Verknüpfung). So kann ich die Eingangsspalte und den Ausgang (den nächsten Schlag) anzeigen.
Nachdem Sie die In- und Out-Spalten in Ihren Daten erhalten haben, möchten Sie möglicherweise einige Daten ausschließen (die ungeraden Zeilen jedes Mitarbeiters sind die gewünschten Zeilen), indem Sie WHERE entered.OrderedPunch %2 = 1
hinzufügen