Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Holen Sie sich alle Stempel für jeden Mitarbeiter ein und aus?

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