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 聚合,另一个使用带 ORDER BY 的 TOP 1):
在日期列没有索引的情况下,MIN 版本的成本为 0.0187916,而 TOP/ORDER BY 版本的成本为 0.115073,因此 MIN 版本“更好”。
在日期列上有索引的情况下,它们表现相同。
请注意,这只是针对这 9 条记录进行测试,因此结果可能(非常)虚假...
更新 2:
这些结果适用于 10,000 条均匀分布的随机记录。当记录数达到 100,000 条时,TOP/ORDER BY 查询运行时间过长,我不得不取消并放弃。