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 (но он должен работать на других СУБД) и производит следующий вывод:
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
Update 1: Для тех, заинтересованы, я сравнил производительность двух вариантов в SQL Server 2008 R2 (один использует агрегат MIN, а другой использует TOP 1 с ORDER BY):
Без индекса в столбце даты версия MIN имела стоимость 0,0187916, а версия TOP/ORDER BY имела стоимость 0,115073, поэтому версия MIN была «лучше».
С индексом в столбце даты они выполняются одинаково.
Обратите внимание, что это тестирование только с этими 9 записей, так что результаты могут быть (очень) поддельными ...
Update 2: Результатов справедливы для 10000 равномерно распределенных случайных записей. Запрос TOP/ORDER BY занимает так много времени, чтобы работать со 100 000 записей, которые я должен был отменить и отказаться.
Какая ваша база данных – Bharat