Я пытаюсь написать запрос, который будет находить переходы, показывая дату до начала перехода и первую дату после пропуска.
Я старался:
SELECT OrderDate FROM Orders
и я получил:
но мне не удается разделить их на такие пробелы:
Как я могу это сделать?
Использование может использовать 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()
, потому что ваши данные дублируются.
Обновлено:
Чтобы найти прыжки, используйте 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);
Это решение «Острова» для пробелы и острова, я думаю, что ОП хочет использовать пробелы.
@ГаретД. . . Спасибо.
@GordonLinoff Спасибо! Я пытаюсь найти только пробелы больше 1, например 1996-07-05 -> 1996-07-08, что мне нужно изменить в ГДЕ?
@eliadchoen . . . Я заменил <>
на >
. Вы можете просто настроить 1
, чтобы изменить минимальный размер зазора, который вы хотите.
Попробуй это:
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;
Я не хочу показаться грубым, но вы задаете ряд вопросов, которые, как вы признали, являются домашним заданием. Вместо того, чтобы попробовать один раз, а затем прийти в SO, вы узнаете гораздо больше, проведя некоторое исследование и предприняв больше попыток. Лично я думаю, что вам лучше спросить о функциях или документации, которые вы не понимаете; что здесь происходит, так это то, что мы эффективно выполняем вашу домашнюю работу за вас. Вы ничему так не научитесь.