Puede usar una subselección o CTE para obtener los datos ordenados por empleado y usarlos como la tabla de datos principal. Algo similar (adáptalo si es necesario) a esto:
;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
Explicación:El CTE 'pedido' sí muestra las entradas/salidas de empleados ordenadas por fecha. El ROW_NUMBER
se restablece para cada empleado (supongo que emp_reader_id contiene la identificación del empleado) debido a PARTITION BY
.
Una vez que obtuve el contador para cada empleado, uno cada marca para cada empleado (primera condición en la combinación izquierda) con la siguiente marca para ese empleado (segunda condición en la combinación izquierda). De esa forma puedo mostrar la columna de entrada y la de salida (el siguiente golpe).
Después de obtener las columnas de entrada y salida en sus datos, es posible que desee excluir algunos datos (las filas impares de cada empleado son las filas que desea) agregando WHERE entered.OrderedPunch %2 = 1