2016-10-23 3 views
0

У меня проблема с представлением, я работаю с Sql Server. У меня есть таблица вроде этого:Комплекс Self-Join

+-------+------+ 
| Start | End | 
+-------+------+ 
|  1 | Null | 
|  3 | 4 | 
|  6 | 9 | 
+-------+------+ 

Эта таблица представляет собой серию таймфрейме, если Энд Null это означает, что он не закончил, но могут быть короткие перерывы (3-4 и 6-9) , Я хотел бы создать представление, которое покажет все таймфреймы, как это:

+-------+------+ 
| Start | End | 
+-------+------+ 
|  1 | 3 | 
|  3 | 4 | 
|  4 | 6 | 
|  6 | 9 | 
|  9 | Null | 
+-------+------+ 

Я не могу найти решение. Я пробовал больше часа, никаких результатов.

ответ

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; 
+1

'WHERE Начало НЕ NULL' иначе мы получим' Значение NULL' из столбца 'END' в результате –

+0

wow, я не знал функции LEAD, большое спасибо – davidinho

+0

Существует проблема, на рабочем сервере SQL-версия - 2008 ... Есть ли альтернатива свинцу? – davidinho