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