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

如果标识列是连续的,您可以使用这种方法:

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

嗯,有趣的挑战。如果您使用新到 2005 年的数据透视功能,我认为您可以在没有自加入的情况下完成此操作。

于 2008-09-09T18:22:09.353 回答
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 回答