Đây là một vấn đề "khoảng trống và đảo". Tôi đã giả mạo dữ liệu thử nghiệm của chính mình (vì bạn không cung cấp bất kỳ dữ liệu nào), nhưng tôi nghĩ nó hoạt động. Trực giác quan trọng là tất cả các giá trị trong cùng một "đảo" (tức là khoảng thời gian liền kề) sẽ có cùng sự khác biệt so với cột row_number (). Nếu bạn muốn có một chút thông tin chi tiết về nó, hãy thực hiện một lựa chọn thô từ IntervalsByDay
cte (trái ngược với truy vấn con mà tôi có bây giờ); điều này sẽ hiển thị cho bạn các hòn đảo được tính toán (với điểm đầu và điểm cuối).
chỉnh sửa:Tôi không thấy rằng bạn đã gặp khó khăn trong lần đầu tiên đi vòng quanh. Câu trả lời của tôi đã được thay đổi để phản ánh dữ liệu của bạn và kết quả mong muốn
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