2008-09-09 26 views
0

我有以下的大致结构:SQL Server计算当前行和下一行之间的datediff的最佳方法是什么?

Object -> Object Revisions -> Data 

数据可以几个对象之间共享。

我想要做的是清理旧的对象修订版。我想保留第一个,主动和修订版本的分布,以便保留一段时间内的最后更改。数据可能会在2天的过程中发生很大的变化,然后单独保留数月,所以我希望在变更开始之前保留最后一个修订版,并且要保留新版本的最终变更。

我目前使用游标和临时表来保存更改之间的ID和日期,所以我可以选择低挂水果摆脱。这意味着使用@LastID,@LastDate,更新并插入到临时表等中...

是否有更简单/更好的方法来计算当前行与下一行之间的日期差异在我的初始结果集不使用游标和临时表?

我在sql server 2000上,但会对2005年,2008年的任何新功能感兴趣,这可能对此也有帮助。

回答

1

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

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

+0

这是一个很好的清洁解决方案。我感到很傻,没有想到ID - 1。 – ddowns 2014-01-29 17:06:25

4

以下是示例SQL。如果你有一个标识列,你可以使用它来代替“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来删除它。

0

Hrmm,有趣的挑战。我认为如果您使用新到2005的透视功能,您可以在没有自联接的情况下执行此操作。

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 [email protected] AND 
         ActiveDate < ORH.ActiveDate), ActiveDate) 
FROM ObjectRevisionHistory ORH 
WHERE [email protected] 


-- 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 [email protected] 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 

我期待扩大,这样我可以保持在最大如此多的修改,并剪掉老的同时仍保持第一,最后,和积极的。应该很容易通过选择top和order by子句,这个......并将ActiveDate扔进临时表中。

我得到了Peter的例子工作,但接受并将其修改为子查询。我搞砸了两个和SQL跟踪显示子选择做少读。但是它确实有效,当我让我的代表达到足够高的水平时,我会给他投票。

相关问题