Postgresのソリューションは、generate_series()
をサポートしているため、かなり簡単です。 。まず、テーブルの各行について、1日あたり1行のデータを展開します。
select d.*, gs.dy
from data d, lateral
generate_series(start_day, end_day) gs(dy);
次に、集計して毎日のタスクを取得します。
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;
その後、再集計できますが、元の行を「分割」している可能性があるため、これには注意が必要です(私のコメントを参照)。これにより、どのタスクをどの日に実行するかについての質問に答えます。
これらはすべて、横方向の結合やgenerate_series()
なしで実行できます。 数値/集計表を使用します。