これは「ギャップと島」の問題です。私は自分のテストデータを偽造しました (提供しなかったため) が、うまくいくと思います。重要な直感は、同じ「島」(つまり、連続した時間間隔) 内のすべての値が、row_number() 列と同じ違いを持つということです。少し洞察が必要な場合は、IntervalsByDay
から生の選択を行います cte (私が今持っているサブクエリとは対照的に);これにより、計算された島が表示されます (始点と終点を含む)。
編集:最初の回でフィドルがあったとは思いませんでした。私の回答は、あなたのデータと望ましい出力を反映するように変更されました
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
プレ>