2017-05-23 19 views
2

私は外部キーとDATETIMEタイムスタンプを含むテーブルを持っています。私は、タイムスタンプが最終タイムスタンプの日の始まりよりも遅いが、各アイテムごとに別々にすべての行を削除したいと思います。GROUP BYを使用したDELETEおよび集計条件

論理的に私はこのような何かしたい:

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

をしかし、私はDELETEでGROUP BYを使用することはできません、また私は、WHERE条件にSUM()を使用することができます。

は、私はこのようなサブクエリを使用して、一度に1つのアイテムでそれらを削除することができます。

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

しかし、私は、単一のクエリ内のすべての項目の削除したいです。どうすればこれを達成できますか?クエリの

+0

@dasblinkenlightが、私は、複数のアイテムIDのために削除したいです。上記の私の質問はItemIdを1つしか処理せず、アイテムごとにタイムスタンプチェックを適用します。上記のクエリは、一度に1つのItemIdのみを処理します。 – mtmacdonald

+0

気にしなくても、クエリの '@ Id'パラメータが欠けていました。あなたの質問を編集して、以前のコメントを入力したときに思ったようにしました。 – dasblinkenlight

答えて

2

を使用することができます。

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

あなたが@Idを使用しないようにクエリを書き直すことができ

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) 
関連する問題