Solusi di Postgres cukup mudah, karena mendukung generate_series()
. Pertama, meledakkan data untuk satu baris per hari untuk setiap baris di tabel Anda:
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
Kemudian, gabungkan untuk mendapatkan tugas setiap hari:
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;
Anda kemudian dapat menggabungkan kembali, tetapi ini rumit karena Anda mungkin telah "membagi" baris asli (lihat komentar saya). Ini menjawab pertanyaan Anda tentang tugas mana yang harus dilakukan pada hari itu.
Anda dapat melakukan semua ini tanpa penggabungan lateral atau generate_series()
dengan menggunakan tabel angka/penghitungan.