यह एक "अंतराल और द्वीप" समस्या है। मैंने अपना खुद का परीक्षण डेटा नकली किया (चूंकि आपने कोई भी प्रदान नहीं किया), लेकिन मुझे लगता है कि यह काम करता है। मुख्य अंतर्ज्ञान यह है कि एक ही "द्वीप" (अर्थात, सन्निहित समय अंतराल) के भीतर सभी मूल्यों में एक पंक्ति_नंबर () कॉलम से समान अंतर होगा। यदि आप इसमें थोड़ी अंतर्दृष्टि चाहते हैं, तो IntervalsByDay
. से एक कच्चा चयन करें सीटीई (अब मेरे पास मौजूद सबक्वायरी के विपरीत); यह आपको परिकलित द्वीप (आरंभ और समाप्ति बिंदुओं के साथ) दिखाएगा।
संपादित करें:मैंने नहीं देखा कि पहली बार घूमने पर आपके पास एक पहेली थी। आपके डेटा और वांछित आउटपुट को दर्शाने के लिए मेरा उत्तर बदल दिया गया है
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