SQL-запрос на запись, показывающий пропуск между датами - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь написать запрос, который найдет прыжки, показывая дату до начала перехода и первую дату после пропуска.

Я пробовал:

SELECT OrderDate FROM Orders

иЯ получил:

enter image description here

, но мне не удалось разбить их на разрывы, как это:

enter image description here

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Использование может использовать dense_rank() для генерации последовательности. Когда вы вычтете это из даты, вы определите смежные последовательные даты.

Итак:

select min(orderdate), max(orderdate)
from (select o.*, dense_rank() over (order by orderdate) as seqnum
      from orders o
     ) o
group by dateadd(day, -seqnum, orderdate)
order by min(orderdate);

Вам нужно dense_rank(), потому что ваши данные имеют дубликаты.

EDIT:

Чтобы найти прыжки, используйте LEAD():

select dateadd(day, 1, orderdate),
       dateadd(day, -1, next_orderdate)
from (select orderdate, lead(orderdate) over (order by orderdate) as next_orderdate
      from (select distinct orderdate orders o) o
     ) o
where next_orderdate > dateadd(day, 1, orderdate);
0 голосов
/ 01 мая 2019

Попробуйте это:

with cte as (select ROW_NUMBER() OVER(ORDER BY OrderDate) as row_num,OrderDate from orders)
select 
curr.OrderDate as Gap_start, 
nex.OrderDate as Gap_end
from 
cte curr
left join
cte nex
on
curr.row_num = nex.row_num - 1;
...