A solução no Postgres é bastante fácil, porque suporta
generate_series()
. Primeiro, exploda os dados de uma linha por dia para cada linha em sua tabela:select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Em seguida, agregue para obter a tarefa para cada dia:
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;
Você pode então reagregar, mas isso é complicado porque você pode ter "dividido" as linhas originais (veja meu comentário). Isso responde à sua pergunta sobre qual tarefa executar em qual dia.
Você pode fazer tudo isso sem uma junção lateral ou
generate_series()
usando uma tabela numérica/tabela.