Die Lösung in Postgres ist ziemlich einfach, da es generate_series()
unterstützt . Lösen Sie zuerst die Daten für eine Zeile pro Tag für jede Zeile in Ihrer Tabelle auf:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Aggregieren Sie dann, um die Aufgabe für jeden Tag zu erhalten:
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;
Sie können dann erneut aggregieren, aber das ist schwierig, weil Sie möglicherweise die ursprünglichen Zeilen "geteilt" haben (siehe meinen Kommentar). Dies beantwortet Ihre Frage, welche Aufgabe an welchem Tag auszuführen ist.
Sie können all dies ohne seitliche Verknüpfung oder generate_series()
tun durch Verwendung einer Nummern-/Tally-Tabelle.