Вы можете получить желаемый результат, LEFT JOIN
предоставив таблицу самой себе, при этом дата в правой таблице является минимальным значением даты, превышающим дату в левой таблице.Этот запрос будет работать независимо от ID
последовательных значений:
SELECT t1.ID, t1.FOCUS, t1.DATE AS STARTDATE, t2.DATE AS ENDDATE
FROM table1 t1
LEFT JOIN table1 t2 ON t2.DATE = (SELECT MIN(DATE)
FROM table1 t3
WHERE t3.DATE > t1.DATE)
Вывод:
ID FOCUS STARTDATE ENDDATE
1 equipment 2018-01-01 2018-02-14
2 uniform 2018-02-14 2018-04-03
3 attendance 2018-04-03 null
Демонстрация на dbfiddle
Если этовозможно, что два события могут завершиться в один и тот же день, вы можете изменить запрос следующим образом, который будет работать до тех пор, пока значения ID
увеличиваются при увеличении значений DATE
.
SELECT DISTINCT t1.ID, t1.FOCUS, t1.DATE AS STARTDATE, t2.DATE AS ENDDATE
FROM table1 t1
LEFT JOIN table1 t2 ON t2.DATE = (SELECT MIN(DATE)
FROM table1 t3
WHERE t3.DATE >= t1.DATE AND t3.ID > t1.ID)
Демо на dbfiddle