То, что вы хотите сделать, будет работать, только если у вас есть уникальный индекс в столбце времени. В вашем примере это дата, для которой требуется только одна запись в день. Другим ограничением может быть то, что самая первая запись (самое низкое значение индекса) имеет ненулевое значение.
Конечно, вы можете использовать coalesce, join или подзапросы, но почему бы не упростить задачу?
Для получения последнего значения, отличного от NULL (или другого значения), просто используйте функцию if()
вместе с определенной пользователем переменной:
SELECT time, IF(action IS NULL, @action, @action:= action) as action FROM t order by time