решил примерно так
WITH T1 as (SELECT `status`, `date`, (LAG(`status`, 1)OVER ()) as last_status FROM `data` ORDER BY `date` DESC)
SELECT * FROM T1 where `status` <> last_status or last_status is null;
Запрос включает функцию LAG(вроде как с 8.0.22 доступна), благодаря которой получаем значение прошлой строки.
Весь результат в табличное выражение.
В выборке сравниваем текущий status с прошлым.
Спасибо
rPman и
Rsa97 за идеи.
По производительности хз, мне для себя, если будут проблемы, могу позволить переделать вообще всё.