Řešení v Postgresu je poměrně snadné, protože podporuje generate_series()
. Nejprve rozložte data pro jeden řádek za den pro každý řádek v tabulce:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Poté agregujte, abyste získali úkol pro každý den:
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;
Poté můžete znovu agregovat, ale je to složité, protože jste mohli "rozdělit" původní řádky (viz můj komentář). To odpovídá na vaši otázku, který úkol který den provést.
To vše můžete provést bez bočního spojení nebo generate_series()
pomocí číselné/sčítací tabulky.