La solución en Postgres es bastante fácil, porque admite generate_series()
. Primero, explote los datos de una fila por día para cada fila de su tabla:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Luego, agrega para obtener la tarea de cada día:
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;
Luego puede volver a agregar, pero esto es complicado porque es posible que haya "dividido" las filas originales (vea mi comentario). Esto responde a su pregunta sobre qué tarea realizar en qué día.
Puede hacer todo esto sin una unión lateral o generate_series()
mediante el uso de una tabla de números/cuentas.