2008-09-09 27 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跟蹤顯示子選擇做少讀。但是它確實有效,當我讓我的代表達到足夠高的水平時,我會給他投票。

相關問題