2013-05-09 98 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