Я бы использовал подзапрос с агрегацией:
select a.*,
(select nz(min(a2.starttime), a.endtime)
from activity as a2
where a2.starttime > a.starttime
) as endtime
from activity as a;
Обычно в таком примере должен быть дополнительный столбец, идентифицирующий какую-то «группировку» - например, человека. Если у вас есть такой столбец, у вас будет условие равенства в подзапросе, а также неравенство по времени.
Кроме того, есть гораздо лучшие способы сделать это практически в любой другой базе данных, особенно lead()
функция.