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
Esto ha sido probado en SQL Server 2008 R2 (pero que debería funcionar en otras bases de datos) y produce el siguiente resultado:
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
Actualización 1: Para aquellos que están interesados, he comparado el rendimiento de las dos variantes en SQL Server 2008 R2 (uno usa el agregado MIN y el otro utiliza TOP 1 con un ORDER BY):
Sin un índice en la columna de fecha, la versión MIN tenía un costo de 0.0187916 y la versión TOP/ORDER BY tenía un costo de 0.115073 por lo que la versión MIN era "mejor".
Con un índice en la columna de fecha, se realizaron de forma idéntica.
Tenga en cuenta que este estaba probando con sólo estos 9 registros por lo que los resultados podrían ser (muy) espuria ...
Actualización 2: Los resultados son válidos para 10.000 registros aleatorios uniformemente distribuidos. La consulta TOP/ORDER BY tarda tanto en ejecutarse en 100.000 registros que tuve que cancelarla y renunciar.
cuál es su base de datos – Bharat