我有一个带有时间间隔的表(开头,结尾,typeid),如下所示:
...
14:10:44 14:15:51 1
14:12:33 14:18:42 2
15:24:09 15:24:17 1
...
有一些规则:类型为id 2 interepts的间隔,类型为1的间隔。 经过处理后我会得到类似的结果:
...
14:10:44 14:18:42 <-- as a result of merging
15:24:09 15:24:17
...
是否存在使用此类数据的任何技术或方法?可能存在任何时间间隔的有用表示吗?
P.S。 SQL Server 2008 R2
答案 0 :(得分:1)
很难对像你这样的数据进行编码。我在现实生活中见过几次。这是两个想法。
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的低值始终是set中的最低值。我也假设没有与type_id 1(和它们的子行)的行重叠集,因为这根本没有意义。