2014-03-27 61 views
0

我在嘗試創建SQL查詢以選擇最近的小時更改以及與先前記錄的時間的差異時遇到問題。創建SQL查詢以查找最近的字段更改

Item ID  Title   RevisedDate  ChangedDate  Rev  WorkHours 
Task 187061 Development  10/9/12 11:14  10/5/12 15:54  1  4 
Task 187061 Development  10/9/12 14:29  10/9/12 11:14  2  8 
Task 187061 Development  10/10/12 15:07 10/9/12 14:29  3  16 
Task 187061 Development  10/11/12 9:59  10/10/12 15:07 4  16 
Task 187061 Development  10/12/12 10:51 10/11/12 9:59  5  16 
Task 187061 Development  12/6/12 15:25  10/12/12 10:51 6  16 
Task 187061 Development  12/11/12 10:27 12/6/12 15:25  7  16 
Task 187061 Development  1/1/99 0:00  12/11/12 10:27 8  16 

所以任務最近的工作時間進行了更新於12年10月10日15:07從8小時到16小時:

該表如下,該數據庫由版本保留了所有歷史版本一起。我在創建查詢時遇到問題以告訴我。

在這一天結束時,我需要的結果: -

Item ID  Title   RevisedDate  ChangedDate  Rev WorkHours ChangeHours 
Task 187061 Development  10/10/12 15:07 10/9/12 14:29 3  16   8 

(PS我把一個任務作爲一個例子,實際的表有數百個任務和一些歷史版本的)

+0

是這個SQL服務器? – KrazzyNefarious

+0

當你說*最近的*時,你究竟意味着什麼?需要哪個日期? – KrazzyNefarious

回答

0

由於我明白你的問題,你要爲每個ID

你獲得最新修訂日期的物品,像這樣:

SELECT * 
FROM 
(
    SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RevisedDate DESC) as ord 
    FROM TABLE 
) T 
WHERE ord = 1 

如果你想要第一個變得更難:

-- First find the ones that changed 
With FlagChange AS 
(
    SELECT T1.ID, T1.REV, T1.RevisedDate 
     CASE WHEN T2 IS NULL THEN FALSE 
       WHEN T1.WorkHour != T2.WorkHour THEN TRUE 
       ELSE FALSE END AS Changed 
    FROM TABLE T1 
    LEFT JOIN TABLE T2 ON T1.ID = T2.ID AND T2.REV = T1.REV-1 
), NumberChange -- now use row number 
(
    SELECT ID, REV, 
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RevisedDate DESC) as ord 
    FROM FlagChange 
    WHERE Changed = True 
), SelectRecent -- take the newest ones 
(
    SELECT ID, REV 
    FROM NumberChange 
    WHERE ord = 1 
) -- add in all the data and the ones with one revision 
SELECT * 
FROM TABLE T1 
JOIN SelectRecient SR ON T1.ID = SR.ID AND T1.REV = SR.REV 
UNION ALL 
SELECT * 
FROM TABLE 
WHERE ID NOT IN (SELECT ID FROM SelectRecent)