讓我們來做一些測試數據;
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