La solution dans Postgres est assez simple, car elle prend en charge generate_series()
. Commencez par exploser les données d'une ligne par jour pour chaque ligne de votre tableau :
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Ensuite, agrégez pour obtenir la tâche pour chaque jour :
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;
Vous pouvez ensuite réagréger, mais c'est délicat car vous avez peut-être "divisé" les lignes d'origine (voir mon commentaire). Cela répond à votre question sur quelle tâche effectuer quel jour.
Vous pouvez faire tout cela sans jointure latérale ou generate_series()
à l'aide d'un tableau de nombre/pointage.