次のスキーマを持つテーブルがあります。
ID NVARCHAR(10)
Message NVARCHAR(300)
UpdateTime DATETIME
ID は外部キーです。新しいメッセージ レコードは、同じ を持つクラスタに追加されますUpdateTime
。例は次のようになります (ID
および でソートUpdateTime
):
ID | Status | UpdateTime
---------------------------------
42 Cluster1-Msg1 2012-12-25
42 Cluster1-Msg2 2012-12-25
42 Cluster2-Msg1 2013-10-10
42 Cluster2-Msg2 2013-10-10
43 Cluster4-Msg1 2011-11-27
ここで、ID #42 は 4 つのメッセージに関連付けられており、異なる日付の 2 つのグループにまとめられていますが、ID #43 は 1 つのメッセージにのみ関連付けられています。
UpdateTime
ときどき、同じ ID を持つ各グループについて、グループ内の最大値よりも小さいすべてのメッセージ レコードを削除して、このテーブルをパージしたいと考えています。上記の例の最終結果は次のようになります。
42 Cluster2-Msg1 2013-10-10
42 Cluster2-Msg2 2013-10-10
43 Cluster4-Msg1 2011-11-27
次の SQL クエリは、削除するすべてのレコードを見つけます。
SELECT Msgs.ID, Msgs.UpdateTime
FROM Messages Msgs
JOIN
(SELECT ID, MAX(UpdateTime) AS MaxTime FROM Messages GROUP BY ID) MaxTimes
ON Msgs.ID = MaxDates.ID
WHERE Msgs.UpdateTime < MaxTimes.MaxTime
ここで、上記のクエリによって返されたアイテムと一致するアイテムを削除する DELETE ステートメントを書きたいと思います。ID
との値に基づいてレコードを削除する必要がありUpdateTime
ます。これを Transact-SQL で表現する方法がわかりません。