2014-03-27 44 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)