sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo seleccionar solo usuarios deslizables de la tabla que tiene todos los registros deslizables?

Creo que desea una lógica como la siguiente, donde verifica si existe un registro de cierre para cada registro de apertura. Sin embargo, no parece posible obtener los resultados esperados con los datos proporcionados.

DECLARE @emp_swipe_rec table (EMPLOYEE_ID int, TASK_ID int, SWIPE_TYPE char(1), SWIPE_IN_OUT_TIME datetime2);

DECLARE @Now datetime2 = '2021-03-07 16:40:00.000'; --sysdatetime();

INSERT INTO @emp_swipe_rec (EMPLOYEE_ID, TASK_ID, SWIPE_TYPE, SWIPE_IN_OUT_TIME)
VALUES
(1,1,'I','2021-03-07 08:00:00.000'),
(2,2,'I','2021-03-07 08:00:00.000'),
(1,1,'O','2021-03-07 15:00:00.000'),
(1,3,'I','2021-03-07 16:00:00.000');

SELECT I.EMPLOYEE_ID, I.TASK_ID
  , DATEDIFF(MINUTE, I.SWIPE_IN_OUT_TIME, @Now) AS TimeSpent
FROM @emp_swipe_rec I
WHERE SWIPE_TYPE = 'I'
-- Rule out any where a closing record in the future exists
AND NOT EXISTS (
  SELECT 1
  FROM @emp_swipe_rec O
  WHERE O.EMPLOYEE_ID = I.EMPLOYEE_ID
  AND O.TASK_ID = I.TASK_ID
  AND SWIPE_TYPE = 'O'
  AND O.SWIPE_IN_OUT_TIME > I.SWIPE_IN_OUT_TIME
);

Devuelve lo siguiente usando una marca de tiempo que da 40 minutos, pero no está seguro de cómo llegó a 130 minutos:

ID_EMPLEADO TAREA_ID Tiempo empleado
2 2 520
1 3 40

Tenga en cuenta que, para referencia futura, si proporciona datos de muestra de esta manera (DDL+DML), no solo hará que su pregunta sea más clara, sino que también hará que sea mucho más fácil de responder para las personas