2017-05-23 3 views
2

Ich habe eine Tabelle, die einen Fremdschlüssel und einen DATETIME-Zeitstempel enthält. Ich möchte alle Zeilen löschen, bei denen der Zeitstempel später als der Anfang des Tages des letzten Zeitstempels ist, aber für jeden Eintrag separat.DELETE mit GROUP BY und aggregierten Bedingungen

Logisch möchte ich etwas wie folgt aus:

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

Aber ich kann nicht GROUP BY in einer DELETE verwenden, noch kann ich SUM() in einer WHERE-Bedingung.

Ich kann sie ein Element zu zum Zeitpunkt unter Verwendung einer Unterabfrage wie folgt löschen:

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

Aber ich will für alle Elemente in einer einzigen Abfrage löschen. Wie kann ich das erreichen?

+0

@dasblinkenlight aber ich will für mehrere ItemIDs löschen. Meine obige Abfrage behandelt nur eine ItemId und wendet die Zeitstempelprüfung für jedes Element separat an. Meine obige Abfrage behandelt jeweils nur eine ItemId. – mtmacdonald

+0

Egal, ich habe den '@ Id' Parameter in Ihrer Anfrage verpasst. Ich habe Ihre Abfrage bearbeitet, um sie zu dem zu machen, was ich bei der Eingabe meines vorherigen Kommentars dachte. – dasblinkenlight

Antwort

2

verwenden Sie Ihre Abfrage neu schreiben kann nicht @Id verwenden:

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

@WEI_DBA Editiert, danke! – dasblinkenlight

2

Für Ihre Anfrage können Sie

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)