让我们来做一些测试数据;
IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData
GO
CREATE TABLE #TestData (Name varchar(7), ID int, Date datetime)
INSERT INTO #TestData (Name, ID, Date)
VALUES
('Login',1,'2016-06-23 12:00:00')
,('Command',1,'2016-06-23 12:05:00')
,('Command',1,'2016-06-23 12:10:00')
,('Login',2,'2016-06-23 12:15:00')
,('Command',1,'2016-06-23 12:20:00')
,('Command',2,'2016-06-23 12:25:00')
,('Logout',1,'2016-06-23 12:30:00')
,('Command',2,'2016-06-23 12:35:00')
我会使用这样的查询。已连接的查询将返回登录和注销日期时间之间的特定ID的所有行。它不会删除ID 2的任何内容,因为还没有注销。
DELETE TD
FROM #TestData TD
INNER JOIN
(
SELECT a.Name, a.ID, a.Date
FROM #TestData a
LEFT JOIN (
SELECT ID, Date
FROM #TestData
WHERE Name = 'Login'
) lin
ON a.ID = lin.ID
LEFT JOIN (
SELECT ID, Date
FROM #TestData
WHERE Name = 'Logout'
) lout
ON a.ID = lout.ID
WHERE a.Date BETWEEN lin.Date AND lout.Date
) b
ON TD.Date = b.Date
AND TD.ID = b.ID
AND TD.Name = b.Name
后,这样的结果已经运行将是
Name ID Date
Login 2 2016-06-23 12:15:00.000
Command 2 2016-06-23 12:25:00.000
Command 2 2016-06-23 12:35:00.000
编辑:更新我的回答,以便它现在删除登录/注销命令了。
与chris更新一样,尝试获取所有具有“注销”条目的ID。做一个直接删除。 – an33sh
您的结果令我困惑,您是否想要完全删除ID 1,因为它既有登录又有注销外观? –
@RichBenner是的,包括登录和注销。 – MisterM