Ini agak rumit. Berikut adalah pendekatan menggunakan fungsi jendela.
Pertama, gunakan tabel tanggal untuk menghitung tanggal tanpa akhir pekan (Anda juga dapat mengambil hari libur jika mau). Kemudian, perluas periode menjadi satu hari per baris, dengan menggunakan non-equijoin.
Anda kemudian dapat menggunakan trik untuk mengidentifikasi hari berurutan. Trik ini adalah menghasilkan nomor urut untuk setiap id dan menguranginya dari nomor urut untuk tanggal. Ini adalah konstan untuk hari berurutan. Langkah terakhir hanyalah agregasi.
Kueri yang dihasilkan adalah seperti ini:
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;
EDIT:
Berikut ini adalah versi pada ini SQL Fiddle:
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;
Saya yakin ini berhasil, tetapi tabel tanggal tidak memiliki semua tanggal di dalamnya.