2014-03-27 3 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 

그래서 작업 가장 최근의 노동 시간이 16 시간을 8 시간에서 10/10/12 15시 7분에 업데이트 된 :

표는, 데이터베이스 버전 모두 함께 역사의 버전을 유지 다음과 같습니다 . 나에게 말해주는 쿼리를 만드는 데 문제가 있습니다. 하루의 끝에서

나는 결과가 필요합니다 -

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 Server입니까? – 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) 
관련 문제