Este é um problema de "lacunas e ilhas". Eu falsificei meus próprios dados de teste (já que você não forneceu nenhum), mas acho que funciona. A intuição chave é que todos os valores dentro da mesma "ilha" (ou seja, intervalo de tempo contíguo) terão a mesma diferença de uma coluna row_number(). Se você quiser um pouco de visão sobre isso, faça uma seleção bruta no
IntervalsByDay
cte (ao contrário da subconsulta que tenho agora); isso mostrará as ilhas calculadas (com pontos inicial e final). edit:eu não vi que você tinha um violino na primeira volta. Minha resposta foi alterada para refletir seus dados e a saída desejada
with i as (
select datediff(minute, '2013-01-01', StartTime) as s,
datediff(minute, '2013-01-01', EndTime) as e
from #track
), brokenDown as (
select distinct n.Number
from i
join dbadmin.dbo.Numbers as n
on n.Number >= i.s
and n.Number <= i.e
), brokenDownWithID as (
select Number, Number - row_number() over(order by Number) as IslandID,
cast(dateadd(minute, number, '2013-01-01') as date) as d
from brokenDown
), IntervalsByDay as (
select
dateadd(minute, min(number), '2013-01-01') as [IntervalStart],
dateadd(minute, max(number), '2013-01-01') as [IntervalEnd],
d,
max(Number) - min(Number) + 1 as [NumMinutes]
from brokenDownWithID
group by IslandID, d
)
select d, sum(NumMinutes) as NumMinutes
from IntervalsByDay
group by d
order by d