Lösningen i Postgres är ganska enkel, eftersom den stöder generate_series()
. Explodera först data för en rad per dag för varje rad i din tabell:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Sammanställ sedan för att få uppgiften för varje 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 sedan aggregera igen, men detta är knepigt eftersom du kanske har "delat upp" de ursprungliga raderna (se min kommentar). Detta svarar på din fråga om vilken uppgift du ska utföra vilken dag.
Du kan göra allt detta utan en lateral join eller generate_series()
genom att använda en siffer-/sammanräkningstabell.