真的很難針對像你這樣的數據進行編碼。在現實生活中我已經看過幾次了。這裏有兩個想法。
declare @t table(low time, high time, type_id tinyint)
insert @t values('14:10:44','14:15:51', 1)
insert @t values('14:12:33','14:18:42', 2)
insert @t values('15:24:09','15:24:17', 1)
select low, coalesce(a.high, t.high) high
from @t t
cross apply (select min(high) high
from @t t2
where high > t.high and type_id = 2
and not exists (select 1 from @t
where t2.high between low and high and type_id = 2 and not
(t2.high = high and t2.low = low))) a
where type_id = 1
這是另一種方法。根據您的數據,甚至可能會更好。
;with cte as
(
select low low2, high, low
from @t where type_id = 1
union all
select cte.high, t.high, cte.low
from @t t
join cte on cte.high > t.low
and cte.high < t.high
where t.type_id = 2
)
select low, max(high) high from cte group by low
我假設低與type_id 1總是最低的集合。我還假設沒有重疊的行與type_id 1(及其子行),因爲這將是沒有意義的。
謝謝!這正是我決定這個問題的原因......但我有大約9個defernt type id,他們有不同的行爲 - 他們可以拆分其他間隔,合併其他類型的間隔,交叉等等。所以我的存儲過程現在看起來像... m ...它看起來很大:о)。我甚至認爲它不會更好地代表一個時間間隔作爲一組秒,並與它一起工作如何一組行... –
我必須看到與測試數據和預期結果的新問題 –