Løsningen i Postgres er ret nem, fordi den understøtter generate_series()
. Først skal du eksplodere dataene for en række om dagen for hver række i din tabel:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Saml derefter for at få opgaven for hver dag:
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;
Du kan derefter aggregere igen, men det er vanskeligt, fordi du måske har "delt" de originale rækker (se min kommentar). Dette besvarer dit spørgsmål om, hvilken opgave du skal udføre på hvilken dag.
Du kan gøre alt dette uden en lateral joinforbindelse eller generate_series()
ved at bruge en tal-/optællingstabel.