2017-02-14 2 views
0

Я ломал мой мозг, но не может сделать следующее эффективным образом:Построить «график» с 2 дня колеблется

В основном я 3 диапазоны дат следующим образом:

ID | StartDate | EndDate 
----------------------------- 
1 | 1905-01-01 | 1910-01-01 
2 | 1920-01-01 | 1990-01-01 
3 | 2010-01-01 | 2020-01-01 

ожидаемый результат:

ID | StartDate | EndDate 
----------------------------- 
1 | 1900-01-01 | 1904-12-31 
2 | 1905-01-01 | 1910-01-01 
3 | 1910-01-02 | 1919-12-31 
4 | 1920-01-01 | 1990-01-01 
5 | 1990-01-02 | 2009-12-31 
6 | 2010-01-01 | 2020-01-01 
7 | 2020-01-02 | 9999-12-31 

из данного набора диапазонов, построить график с кратчайшими сроков до последней возможной даты.

Я построил один запрос, но он очень неэффективен. Он использует LEAD и LAG, но фактические наборы результатов - «UNION ALL» - по одному за раз. Кроме того, он не является динамическим, он может обрабатывать только 3 диапазона дат за раз. Я пытаюсь построить динамический, но каждый раз, когда я пытаюсь, я в конечном итоге приближаюсь к проблеме одинаково. Любая помощь будет оценена по достоинству.

спасибо.

ответ

0

Если я правильно понимаю, вы можете просто перечислить даты и использовать lead():

select row_number() over (order by dte) as id, 
     dte as startDate, 
     coalesce(dateadd(day, -1, lead(dte) over (order by dte)), '9999-12-31') 
from ((select startDate as dte 
     from t 
    ) union all 
     (select endDate as dte 
     from t 
    ) 
    ) t; 
Смежные вопросы