Detta är ett "luckor och öar"-problem. Jag fejkade mina egna testdata (eftersom du inte angav några), men jag tror att det fungerar. Nyckelintuitionen är att alla värden inom samma "ö" (det vill säga sammanhängande tidsintervall) kommer att ha samma skillnad från en row_number() kolumn. Om du vill ha en liten inblick i det, gör ett råval från IntervalsByDay
cte (i motsats till underfrågan jag har nu); detta visar dig de beräknade öarna (med start- och slutpunkter).
edit:Jag såg inte att du hade en fiol första gången. Mitt svar har ändrats för att återspegla dina uppgifter och önskat resultat
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