2017-05-23 73 views
2

我有一個包含外鍵和DATETIME時間戳的表。我想刪除時間戳晚於最終時間戳的開始日期的所有行,但要分別爲每個項目。用GROUP BY和聚合條件刪除

按道理我想是這樣的:

DELETE FROM Entries 
WHERE StartTime > CONVERT(Date,MAX(StartTime)) 
GROUP BY ItemId; 

但我不能在DELETE使用GROUP BY,我也可以在WHERE條件中使用SUM()。

我可以一個項目在時刻使用子查詢這樣的刪除:

DELETE FROM Entries 
WHERE [email protected] 
AND StartTime > (
    SELECT CONVERT(Date,MAX(StartTime)) FROM Entries 
    WHERE [email protected] 
) 

但我想刪除在單個查詢所有項目。我怎樣才能做到這一點?

+0

@dasblinkenlight但我想刪除多個ItemIds。我上面的查詢只處理一個ItemId,爲每個項目分別應用時間戳檢查。我上面的查詢一次只處理一個ItemId。 – mtmacdonald

+0

沒關係,我錯過了查詢中的@ Id參數。我編輯了你的查詢,使之成爲我以前的評論。 – dasblinkenlight

回答

2

你可以重寫查詢以不使用@Id

DELETE e 
FROM Entries AS e 
WHERE StartTime > (
    SELECT CONVERT(Date,MAX(StartTime)) FROM Entries ee 
    WHERE ee.ItemId=e.Id 
) 
+1

@WEI_DBA編輯,謝謝! – dasblinkenlight

2

爲您查詢,您可以使用

DELETE FROM E 
FROM Entries E JOIN (
SELECT ItemId, MAX(StartTime) st from Entries GROUP BY ItemId)E2 
ON E.ItemId=E2.ItemId 
WHERE E.StartTime > CONVERT(Date,E2.st)