これはかなり複雑です。これは、ウィンドウ関数を使用したアプローチです。
まず、日付テーブルを使用して、週末を含まない日付を列挙します (必要に応じて、休日を除外することもできます)。次に、非等結合を使用して、期間を行ごとに 1 日に拡張します。
その後、トリックを使用して連続した日を識別できます。このトリックは、各 ID の連番を生成し、日付の連番から差し引くことです。これは、連日一定です。最後のステップは単なる集計です。
結果のクエリは次のようになります:
with d as ( select d.*, row_number() over (order by date) as seqnum from dates d where day not in ('Saturday', 'Sunday') ) select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration) from (select t.*, ds.seqnum, ds.date, (d.seqnum - row_number() over (partition by id order by ds.date) ) as grp from table t join d ds on ds.date between t.startdate and t.enddate ) t group by t.id, grp;
プレ>編集:
以下は こちら のバージョンです SQL フィドル:
with d as ( select d.*, row_number() over (order by date) as seqnum from datetable d where day not in ('Saturday', 'Sunday') ) select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration) from (select t.*, ds.seqnum, ds.date, (ds.seqnum - row_number() over (partition by id order by ds.date) ) as grp from (select t.*, 'abc' as id from table1 t) t join d ds on ds.dateid between t.startdate and t.enddate ) t group by grp;
プレ>これは機能していると思いますが、日付テーブルにすべての日付が含まれているわけではありません.