2010-02-08 6 views
1

데이터가 부정확하게 입력되는시기를 결정하는 쿼리를 작성해야합니다. 우리는 "ProductChanges"라는 테이블을 가지고 있습니다. 에 OldValue이 <NULL>을 때SQL : 부정확 한 데이터 입력을 반환하는 쿼리

Product User  ChangeDate   OldValue  NewValue 
2344  John  24/01/10 10:00   2344   4324 
6435  Greg  28/01/10 13:30   543   6435 
6532  Tony  29/01/10 09:45  <NULL>   234 

는, 그것이 새로운 제품 기록을 의미 - 그것은이 같은 (뭔가를) 찾습니다. 모든 데이터가 업데이트됨에 따라 레코드 생성 첫 시간 내에 여러 가지 변경 사항이있을 것으로 예상됩니다. 그러나 그 이후의 변경 사항은 초기 기록이 부정확하게 기록되었음을 의미하는 것으로 간주됩니다.

그래서 ... 내가 생각해내는 것은 지난 달 내에 생성 된 모든 제품 레코드를 반환하는 쿼리로, 초기 레코드가 생성 된 후 1 시간 후에 기록됩니다. 출력을 위해 초기 레코드와 모든 후속 변경을 원합니다. 예 : -

Product User  ChangeDate   OldValue  NewValue 
6532  Tony  29/01/10 09:45  <NULL>   234 
6532  Fred  01/02/10 11:37   234   4324 

미리 감사드립니다.

업데이트는 : - 단지 입구 날짜를 가져오고보다 더 많은 일이 변경에 가입 우리는 내가 제대로 이해 해요 경우 2000

답변

1

은 매우 간단 보이는 SQL Server에서이 데이터베이스를 실행하는 시간 후에.

SELECT pc.Product, pc.User, pc.ChangeDate, pc.OldValue, pc.NewValue 
FROM 
(
    SELECT Product, ChangeDate AS EntryDate 
    FROM ProductChanges 
    WHERE OldValue IS NULL 
) e 
INNER JOIN ProductChanges pc 
    ON pc.Product = e.Product 
WHERE EXISTS 
(
    SELECT 1 
    FROM ProductChanges 
    WHERE Product = e.Product 
    AND ChangeDate > DATEADD(HOUR, 1, e.EntryDate) 
) 
AND e.EntryDate >= @BeginDate 
AND e.EntryDate <= @EndDate 

모든 "문제"세트에 대한 전체 기록을 원하기 때문에 두 번째 조인 만 필요합니다. ID 만 있으면 중간 결합을 제거하고 e.Product을 선택하여이 쿼리를보다 효율적으로 만들 수 있습니다.

+0

Ah가 지정 했어야 함 - SQL Server 2000을 사용하고 있으므로 사용할 수 없습니다. –

+1

아, 문제가 없습니다. 하위 쿼리로 작성하겠습니다. – Aaronaught

+0

환호하는 친구, 훌륭한 –

0
select * from pc where product in (select distinct a.product from pc a, pc b 
where a.product = b.product and a.changedate > dateadd(hh, 1, b.changedate)) 
order by product, changedate 
관련 문제