Това е проблем с "пропуски и острови". Фалшифицирах собствените си тестови данни (тъй като не предоставихте такива), но мисля, че работи. Ключовата интуиция е, че всички стойности в рамките на един и същ „остров“ (тоест непрекъснат интервал от време) ще имат същата разлика от колона row_number(). Ако искате малко вникване в това, направете необработен избор от IntervalsByDay
cte (за разлика от подзаявката, която имам сега); това ще ви покаже изчислените острови (с начална и крайна точка).
едит:Не видях, че имаш цигулка при първото заобикаляне. Отговорът ми е променен, за да отразява вашите данни и желания резултат
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