复杂的自我加入

时间:2016-10-23 15:39:18

标签: sql sql-server view self-join

我对视图有疑问,我正在使用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 |
+-------+------+

我无法找到解决方案。我试了一个多小时没有结果。

1 个答案:

答案 0 :(得分:4)

我认为您希望union alllead()

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;