Dette er et "huller og øer"-problem. Jeg forfalskede mine egne testdata (da du ikke har givet nogen), men jeg tror, det virker. Nøgleintuitionen er, at alle værdier inden for den samme "ø" (det vil sige sammenhængende tidsinterval) vil have den samme forskel fra en row_number() kolonne. Hvis du vil have et lille indblik i det, så lav et råvalg fra IntervalsByDay
cte (i modsætning til den underforespørgsel, jeg har nu); dette vil vise dig de beregnede øer (med start- og slutpunkter).
edit:Jeg så ikke, at du havde en violin i første omgang. Mit svar er blevet ændret for at afspejle dine data og ønskede output
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