Ini adalah masalah "kesenjangan dan pulau". Saya memalsukan data pengujian saya sendiri (karena Anda tidak memberikannya), tetapi saya pikir itu berhasil. Intuisi utamanya adalah bahwa semua nilai dalam "pulau" yang sama (yaitu, interval waktu yang berdekatan) akan memiliki perbedaan yang sama dari kolom row_number() . Jika Anda ingin sedikit wawasan tentangnya, lakukan pemilihan mentah dari IntervalsByDay
cte (sebagai lawan dari subquery yang saya miliki sekarang); ini akan menunjukkan kepada Anda pulau yang dihitung (dengan titik awal dan akhir).
sunting:Saya tidak melihat bahwa Anda memiliki biola pada putaran pertama. Jawaban saya telah diubah untuk mencerminkan data Anda dan hasil yang diinginkan
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