0

私は次の大まかな構造を持っています:

Object -> Object Revisions -> Data

データは複数のオブジェクト間で共有できます。

私がやろうとしているのは、古いオブジェクト リビジョンを一掃することです。一定期間の最後の変更が保持されるように、最初の、アクティブな、およびリビジョンの広がりを保持したいと考えています。データは 2 日間で大幅に変更され、その後数か月間放置される可能性があるため、変更が開始される前の最後のリビジョンと新しいセットの最後の変更を保持したいと考えています。

私は現在、カーソルと一時テーブルを使用して ID と変更間の日付を保持しているので、簡単に解決できる成果を選択して取り除くことができます。これは、@LastID、@LastDate、一時テーブルへの更新と挿入などを使用することを意味します...

カーソルと一時テーブルを使用せずに、最初の結果セットの現在の行と次の行の日付の差を計算するより簡単で良い方法はありますか?

私はSQL Server 2000を使用していますが、これにも役立つ2005年、2008年の新機能に興味があります。

4

4 に答える 4

4

これがSQLの例です。Identity 列がある場合は、「ActivityDate」の代わりにこれを使用できます。

SELECT DATEDIFF(HOUR, prev.ActivityDate, curr.ActivityDate)
  FROM MyTable curr
  JOIN MyTable prev
    ON prev.ObjectID = curr.ObjectID
  WHERE prev.ActivityDate =
     (SELECT MAX(maxtbl.ActivityDate)
        FROM MyTable maxtbl
        WHERE maxtbl.ObjectID = curr.ObjectID
          AND maxtbl.ActivityDate < curr.ActivityDate)

「prev」を削除することもできますが、削除するために ID が必要であると仮定して、そこに置いておきます。

于 2008-09-09T17:49:09.887 に答える
1

ID 列が連続している場合は、次のアプローチを使用できます。

SELECT curr.*, DATEDIFF(MINUTE, prev.EventDateTime,curr.EventDateTime) Duration FROM DWLog curr join DWLog prev on prev.EventID = curr.EventID - 1

于 2014-01-14T12:32:17.513 に答える
0

これが私がこれまでに得たものです。回答を受け入れる前に、もう少し時間を割きたいと思いました。

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 トレースは、サブセレクトの読み取りが少ないことを示しています。しかし、それはうまくいきます。担当者が十分に高くなったら、彼に投票します.

于 2008-09-09T19:34:19.867 に答える
0

うーん、興味深い挑戦です。2005 の新しいピボット機能を使用すれば、自己結合なしで実行できると思います。

于 2008-09-09T18:22:09.353 に答える