これが私がこれまでに得たものです。回答を受け入れる前に、もう少し時間を割きたいと思いました。
DECLARE @IDs TABLE
(
ID int ,
DateBetween int
)
DECLARE @OID int
SET @OID = 6150
-- Grab the revisions, calc the datediff, and insert into temp table var.
INSERT @IDs
SELECT ID,
DATEDIFF(dd,
(SELECT MAX(ActiveDate)
FROM ObjectRevisionHistory
WHERE ObjectID=@OID AND
ActiveDate < ORH.ActiveDate), ActiveDate)
FROM ObjectRevisionHistory ORH
WHERE ObjectID=@OID
-- Hard set DateBetween for special case revisions to always keep
UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MIN(ID) FROM @IDs)
UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MAX(ID) FROM @IDs)
UPDATE @IDs SET DateBetween = 1000
WHERE ID=(SELECT ID
FROM ObjectRevisionHistory
WHERE ObjectID=@OID AND Active=1)
-- Select out IDs for however I need them
SELECT * FROM @IDs
SELECT * FROM @IDs WHERE DateBetween < 2
SELECT * FROM @IDs WHERE DateBetween > 2
これを拡張して、最大で非常に多くのリビジョンを保持し、最初、最後、およびアクティブな状態を維持しながら古いものを削除できるようにしようと考えています。select top 句と order by 句、ええと...そして ActiveDate を一時テーブルに投げ込むだけで十分に簡単なはずです。
私はピーターの例を機能させましたが、それを採用してサブセレクトに変更しました。私は両方をいじりましたが、SQL トレースは、サブセレクトの読み取りが少ないことを示しています。しかし、それはうまくいきます。担当者が十分に高くなったら、彼に投票します.