Możesz użyć podselekcji lub CTE, aby uzyskać dane uporządkowane przez pracownika i użyć ich jako głównej tabeli danych. Coś podobnego (dostosuj w razie potrzeby) do tego:
;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
Wyjaśnienie:„Zamówione” CTE pokazuje wejścia/wyjścia pracownika uporządkowane według daty. ROW_NUMBER
jest resetowany dla każdego pracownika (zakładam, że emp_reader_id zawiera identyfikator pracownika) z powodu PARTITION BY
.
Po otrzymaniu licznika dla każdego pracownika łączę każdy stempel dla każdego pracownika (pierwszy warunek w lewym sprzężeniu) z następnym stemplem dla tego pracownika (drugi warunek w lewym sprzężeniu). W ten sposób mogę pokazać kolumnę wejścia i wyjście (następny cios).
Po uzyskaniu kolumn wejściowych i wyjściowych w swoich danych możesz chcieć wykluczyć niektóre dane (nieparzyste wiersze każdego pracownika to te, które chcesz) dodając WHERE entered.OrderedPunch %2 = 1