SQL Объединение как подзапрос для создания диапазонов дат с даты начала - PullRequest
1 голос
/ 27 февраля 2020

У меня есть три табеля, у каждого из них есть столбец даты (столбец даты является полем INT и должен оставаться таким). Мне нужно СОЮЗ по всем трем таблицам, чтобы я получил список уникальных дат в порядке присоединения, например:

20040602  
20051215  
20060628  
20100224  
20100228  
20100422  
20100512  
20100615 

Затем мне нужно добавить столбец к результату запроса, где я вычитаю одну из каждую дату и поместите ее на одну строку выше в качестве даты окончания. По сути, мне нужно как-то сгенерировать дату окончания из даты начала, и вот что я получил (не работает):

With Query1 As (
    Select date_one As StartDate
    From table_one
     Union
     Select date_two As StartDate
     From table_two
     Union
     Select date_three e As StartDate
     From table_three
     Order By Date Asc
     )
Select Query1.StartDate - 1 As EndDate
From Query1

Большое спасибо за вашу помощь!

1 Ответ

2 голосов
/ 27 февраля 2020

Опираясь на существующий union cte, мы можем использовать lead() во внешнем запросе, чтобы получить start_date следующей записи и извлечь из нее 1.

with q as (
    select date_one start_date  from table_one
    union select date_two from table_two
    union select date_three from table_three
)
select 
    start_date,
    dateadd(day, -1, lead(start_date) over(order by start_date)) end_date
from q
order by start_date

Если тип данных исходных столбцов имеет числовое значение c, то перед применением функций даты необходимо выполнить некоторое приведение:

with q as (
    select cast(cast(date_one as varchar(8)) as date) start_date  from table_one
    union select cast(cast(date_two as varchar(8)) as date) from table_two
    union select cast(cast(date_three as varchar(8)) as date) from table_three
)
select 
    start_date,
    dateadd(day, -1, lead(start_date) over(order by start_date)) end_date
from q
order by start_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...