SQL – 选择下一个日期查询

前端之家收集整理的这篇文章主要介绍了SQL – 选择下一个日期查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个表与许多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个记录,我不得不取消它并放弃.

猜你在找的MsSQL相关文章