La soluzione in Postgres è abbastanza semplice, perché supporta generate_series()
. Innanzitutto, esplodi i dati per una riga al giorno per ogni riga nella tabella:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Quindi, aggrega per ottenere l'attività per ogni giorno:
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;
Puoi quindi riaggregare, ma questo è complicato perché potresti aver "diviso" le righe originali (vedi il mio commento). Questo risponde alla tua domanda su quale attività eseguire in quale giorno.
Puoi fare tutto questo senza un join laterale o generate_series()
utilizzando un numero/tabella di conteggio.