我有一个表与许多ID和许多日期与每个ID相关联,甚至几个没有日期的ID.对于每个ID和日期组合,我想选择ID,日期和与该相同ID相关联的下一个最大日期,如果不存在,则选择null作为下一个日期.
样品表:
ID Date 1 5/1/10 1 6/1/10 1 7/1/10 2 6/15/10 3 8/15/10 3 8/15/10 4 4/1/10 4 4/15/10 4
所需输出:
ID Date Next_Date 1 5/1/10 6/1/10 1 6/1/10 7/1/10 1 7/1/10 2 6/15/10 3 8/15/10 3 8/15/10 4 4/1/10 4/15/10 4 4/15/10
解决方法
SELECT mytable.id,mytable.date,( SELECT MIN(mytablemin.date) FROM mytable AS mytablemin WHERE mytablemin.date > mytable.date AND mytable.id = mytablemin.id ) AS NextDate FROM mytable
这已经在sql Server 2008 R2上进行了测试(但它应该适用于其他DBMS),并产生以下输出:
id date NextDate ----------- ----------------------- ----------------------- 1 2010-05-01 00:00:00.000 2010-06-01 00:00:00.000 1 2010-06-01 00:00:00.000 2010-06-15 00:00:00.000 1 2010-07-01 00:00:00.000 2010-08-15 00:00:00.000 2 2010-06-15 00:00:00.000 2010-07-01 00:00:00.000 3 2010-08-15 00:00:00.000 NULL 3 2010-08-15 00:00:00.000 NULL 4 2010-04-01 00:00:00.000 2010-04-15 00:00:00.000 4 2010-04-15 00:00:00.000 2010-05-01 00:00:00.000 4 NULL NULL
更新1:
对于那些有兴趣的人,我比较了sql Server 2008 R2中的两个变体的性能(一个使用MIN集合,另一个使用TOP 1和ORDER BY):
没有日期列上的索引,MIN版本的成本为0.0187916,TOP / ORDER BY版本的成本为0.115073,所以MIN版本“更好”.
使用日期列上的索引,它们执行相同.
请注意,这只是测试这9个记录,所以结果可能是(非常)假的…
更新2:结果持有10,000个均匀分布的随机记录. TOP / ORDER BY查询需要很长的时间才能运行100,000个记录,我不得不取消它并放弃.