Sql 如何从表中转义一个或多个连续行,inoutMode为1或0

Sql 如何从表中转义一个或多个连续行,inoutMode为1或0,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有一个表,结果如下: Id EmpCode CheckInCheckOutDate WorkDate InOutMode 85223 175 2017-10-27 11:20:39.000 2017-10-27 11:20:39.000 0 85832 175 2017-10-27 14:21:21.000 2017-10-27 14:21:21.000 1 85844 175 2017-10-27 14:36:23.000 2017-10-

我有一个表,结果如下:

Id      EmpCode        CheckInCheckOutDate     WorkDate     InOutMode
85223   175 2017-10-27 11:20:39.000 2017-10-27 11:20:39.000 0
85832   175 2017-10-27 14:21:21.000 2017-10-27 14:21:21.000 1
85844   175 2017-10-27 14:36:23.000 2017-10-27 14:36:23.000 0
85863   175 2017-10-27 15:21:27.000 2017-10-27 15:21:27.000 1
85878   175 2017-10-27 16:03:46.000 2017-10-27 16:03:46.000 0
86031   175 2017-10-27 18:14:41.000 2017-10-27 18:14:41.000 1
86038   175 2017-10-27 18:34:45.000 2017-10-27 18:34:45.000 0
**86039 175 27.10.2017 18:34:46.000 27.10.2017 18:34:46.000 1
86142   175 2017-10-27 19:51:15.000 2017-10-27 19:51:15.000 1**
86162   175 2017-10-27 20:25:44.000 2017-10-27 20:25:44.000 0
86170   175 2017-10-27 20:31:58.000 2017-10-27 20:31:58.000 1
我想得到如下结果:在转义连续行的InOutMode列中具有相同值的一个连续行之后,0或1条件基于workdate, 例如:id为“86039”和“86142”行,我们在最后一列中有相同的值“1”,所以我想先删除 行和想逃出的只有旧行

85223   175 2017-10-27 11:20:39.000 2017-10-27 11:20:39.000 0
85832   175 2017-10-27 14:21:21.000 2017-10-27 14:21:21.000 1
85844   175 2017-10-27 14:36:23.000 2017-10-27 14:36:23.000 0
85863   175 2017-10-27 15:21:27.000 2017-10-27 15:21:27.000 1
85878   175 2017-10-27 16:03:46.000 2017-10-27 16:03:46.000 0
86031   175 2017-10-27 18:14:41.000 2017-10-27 18:14:41.000 1
86038   175 2017-10-27 18:34:45.000 2017-10-27 18:34:45.000 0
86142   175 2017-10-27 19:51:15.000 2017-10-27 19:51:15.000 1
86162   175 2017-10-27 20:25:44.000 2017-10-27 20:25:44.000 0
86170   175 2017-10-27 20:31:58.000 2017-10-27 20:31:58.000 1

您可以使用窗口功能:

WITH cte AS (
  select * ,SUM(CASE WHEN InOutMode=1 THEN 0 ELSE 1 END) -- SUM(1-InOutMode)
            OVER(PARTITION BY EmpCode ORDER BY ID) s
  from test1
), cte2 AS (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY EmpCode, s ORDER BY id) as rn
  FROM cte 
), cte3 AS (
   SELECT *, MAX(rn) OVER(PARTITION BY EmpCode, s) AS m
   FROM cte2
)
DELETE FROM cte3
WHERE rn > 1 AND rn <> m;

SELECT *
FROM test1;
演示idea触发器的中间结果:


如果您需要,您可以添加更多的分区,例如白天。

@ad2025感谢您的回复,但我想转义行id:86039而不是86142始终希望数据大于workdate。@GoutamSingh这次请再次仔细检查。如果InOutMode=1,则0否则1结束,您可以使用1代替大小写-InOutMode@ad2025你好此代码显示错误消息:“order”附近的语法不正确。“order”附近的语法不正确。在SQL server 2008 r2中,您可以解决此问题吗?谢谢Goutam