Esto es bastante complicado. Aquí hay un enfoque usando funciones de ventana.
Primero, use la tabla de fechas para enumerar las fechas sin fines de semana (también puede eliminar los días festivos si lo desea). Luego, expanda los períodos a un día por fila, usando una unión no equitativa.
Luego puede usar un truco para identificar días secuenciales. Este truco consiste en generar un número secuencial para cada id y restarlo del número secuencial de las fechas. Esta es una constante para días secuenciales. El paso final es simplemente una agregación.
La consulta resultante es algo como esto:
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;
EDITAR:
La siguiente es la versión de this Violín 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;
Creo que esto está funcionando, pero la tabla de fechas no tiene todas las fechas.