Я думаю, что это то, что вы хотите:
SELECT
t.Id,
t.old_value,
t.new_value,
t.StartDate,
-- if it's the latest entry of distinct old_value new_value pairs
IF(t1.Id IS NULL, t2.StartDate - INTERVAL 1 DAY, t.StartDate) AS EndDate
FROM three t
LEFT JOIN three t1 ON t.old_value = t1.old_value AND t.new_value = t1.new_value
AND t.StartDate > t1.StartDate
LEFT JOIN three t2 ON t.new_value = t2.old_value
;
Трудно сказать, без шоу создает и пригодные образцы данных.