2013-05-09 3 views
0

첫 번째 레코드 (작은 샘플)는 TSQL 나는 다음과 같은 데이터와 SQL Server 2008의 테이블이

id           Date Value 
20448D6F-4099-408D-85FE-11EC6690CDB8 2010-06-01 1 
20448D6F-4099-408D-85FE-11EC6690CDB8 2010-06-02 2 
20448D6F-4099-408D-85FE-11EC6690CDB8 2010-06-03 3 
20448D6F-4099-408D-85FE-11EC6690CDB8 2010-06-04 4 
20448D6F-4099-408D-85FE-11EC6690CDB8 2010-06-05 NULL 
EF595DE6-FF57-4625-8254-287F49843445 2010-06-02 2 
EF595DE6-FF57-4625-8254-287F49843445 2010-06-03 3 
EF595DE6-FF57-4625-8254-287F49843445 2010-06-04 4 
EF595DE6-FF57-4625-8254-287F49843445 2010-06-05 NULL 
C6F459EF-1493-4864-81C2-E5B55283EF0C 2010-06-04 45 
C6F459EF-1493-4864-81C2-E5B55283EF0C 2010-06-05 NULL 

내가 쿼리

id           Date   Value 
20448D6F-4099-408D-85FE-11EC6690CDB8 2010-06-01   1 
을 반환

select * 
from [test].[dbo].[testtable] 
where id in 
     (
      select id 
      from [test].[dbo].[testtable] 
      where Date='2010-06-05' and Value is null 
     ) 
    and Date = DATEADD(D, -4, '2010-06-05') 

를 실행하고 반환

하지만 2010-06-01에 대한 레코드가없는 경우 다음 최소 날짜를 반환하고 싶습니다.

그래서 샘플에서 볼 것이다 결과가 될 것

id           Date   Value 
20448D6F-4099-408D-85FE-11EC6690CDB8 2010-06-01   1 
EF595DE6-FF57-4625-8254-287F49843445 2010-06-02   2 
C6F459EF-1493-4864-81C2-E5B55283EF0C 2010-06-04   45 

나는이 T-SQL 쿼리에서이 작업을 수행 할 수있는 방법 기록의 수백만 있나요?

감사

답변

0

당신은 하위 쿼리에 MIN 집계를 사용할 수 있습니다

SELECT t.Id, t.Date, t.Value 
FROM [test].[dbo].[testtable] t 
    JOIN (
     SELECT Min(Date) MinDate, Id 
     FROM [test].[dbo].[testtable] 
     WHERE Date >= '6/1/2010' 
     GROUP BY Id 
    ) t2 ON t.Id = t2.Id AND t.Date = t2.MinDate 
WHERE t.Id IN (
    SELECT id 
    FROM [test].[dbo].[testtable] 
    WHERE Date='2010-06-05' and Value is null 
    ) 

SQL Fiddle Demo

+0

작동하지 않습니다 THER도 EF595DE6-FF57-4625-8254-287F49843445 처럼 기록 할 수 있습니다 2010-05-05 444가 반환됩니다. – user2062675

+0

@ user2062675 - 날짜가 6/1/2010 이상이어야하는 기준을 추가하십시오. – sgeddes

+0

죄송합니다.이 질문에 답을 수정할 수 있습니까? – user2062675

관련 문제