2013-05-09 170 views
0

我有一個SQL Server 2008的表具有以下數據(小樣本)TSQL返回的第一條記錄

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 

我運行查詢

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') 

返回

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

但是當記錄不存在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

這是行不通的療法,也可以記錄像EF595DE6,FF57-4625-8254-287F49843445 2010-05-05 444將返回 – user2062675 2013-05-09 19:29:35

+0

@ user2062675 - 只需添加條件,以便日期必須大於或等於6/1/2010然後 – sgeddes 2013-05-09 19:30:50

+0

對不起,我是一個新手,你可以修改你的答案嗎? – user2062675 2013-05-09 19:31:39