Решението в Postgres е доста лесно, защото поддържа generate_series()
. Първо разбийте данните за един ред на ден за всеки ред във вашата таблица:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
След това обобщете, за да получите задачата за всеки ден:
select d.person, d.dy, max(d.task_key) as task_key
from (select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy)
) d
group by d.person, d.dy;
След това можете да групирате отново, но това е трудно, защото може да сте „разделили“ оригиналните редове (вижте моя коментар). Това отговаря на въпроса ви коя задача да изпълните в кой ден.
Можете да направите всичко това без странично свързване или generate_series()
чрез използване на таблица с числа/таблици.