Rozwiązanie w Postgresie jest dość proste, ponieważ obsługuje generate_series()
. Najpierw rozbij dane dla jednego wiersza dziennie dla każdego wiersza w tabeli:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Następnie zsumuj, aby otrzymać zadanie na każdy dzień:
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;
Następnie możesz ponownie agregować, ale jest to trudne, ponieważ możesz „podzielić” oryginalne wiersze (patrz mój komentarz). To odpowiada na Twoje pytanie, które zadanie wykonać w danym dniu.
Możesz to wszystko zrobić bez łączenia bocznego lub generate_series()
za pomocą tabeli liczb/podsumowań.