我对视图有疑问,我正在使用Sql Server。 我有一张这样的桌子:
+-------+------+
| Start | End |
+-------+------+
| 1 | Null |
| 3 | 4 |
| 6 | 9 |
+-------+------+
此表代表一系列时间帧,如果End为Null则表示尚未完成,但可能有短暂的中断(3-4和6-9),我想创建一个将显示所有的视图像这样的时间框架:
+-------+------+
| Start | End |
+-------+------+
| 1 | 3 |
| 3 | 4 |
| 4 | 6 |
| 6 | 9 |
| 9 | Null |
+-------+------+
我无法找到解决方案。我试了一个多小时没有结果。
答案 0 :(得分:4)
我认为您希望union all
与lead()
:
select start, lead(start) over (order by start)
from ((select t.start as start from likethis t
) union all
(select t.end from likethis t
)
) t
where start is not null
order by start;
在早期版本的SQL Server中,您可以使用cross apply
:
with t as (
select t.start as start from likethis t
union all
select t.end from likethis t
)
select t.start, tnext.start
from t cross apply
(select top 1 t2.*
from t t2
where t2.start > t.start
order by t2.start desc
) tnext
order by start;