Ваш вопрос немного сбивает с толку, потому что два набора данных выглядят так, как будто они имеют приблизительно одинаковые строки, но различаются.
Один из способов получить то, что вы хотите, - использовать cross join
для генерациистроки, а затем подзапрос для баланса:
select d.dte, i.id,
(select t2.after_balance
from t t2
where cast(t2.create_time as date) <= d.dte and
t2.id = i.id
order by t2.create_time desc
limit 1 -- fetch first 1 row only
) as balance
from (select distinct cast(create_time as date) as dte
from t
) d cross join
(select distinct id
from t
) i
order by d.dte, i.id;
Используется стандартный / общий SQL. Некоторые функции могут быть по-разному выражены в используемой вами базе данных.