Dit is een probleem van "gaten en eilanden". Ik heb mijn eigen testgegevens vervalst (omdat je er geen hebt verstrekt), maar ik denk dat het werkt. De belangrijkste intuïtie is dat alle waarden binnen hetzelfde "eiland" (dat wil zeggen een aaneengesloten tijdsinterval) hetzelfde verschil hebben met een rij_nummer() kolom. Als je er een beetje inzicht in wilt hebben, maak dan een ruwe selectie uit de IntervalsByDay
cte (in tegenstelling tot de subquery die ik nu heb); dit toont u de berekende eilanden (met begin- en eindpunten).
edit:ik had niet gezien dat je de eerste keer een viool had. Mijn antwoord is gewijzigd om uw gegevens en gewenste output weer te geven
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