Запрос на запись SQL, который показывает пропуск между датами

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

Я старался:

SELECT OrderDate FROM Orders

и я получил:

Запрос на запись SQL, который показывает пропуск между датами

но мне не удается разделить их на такие пробелы:

Запрос на запись SQL, который показывает пропуск между датами

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

Я не хочу показаться грубым, но вы задаете ряд вопросов, которые, как вы признали, являются домашним заданием. Вместо того, чтобы попробовать один раз, а затем прийти в SO, вы узнаете гораздо больше, проведя некоторое исследование и предприняв больше попыток. Лично я думаю, что вам лучше спросить о функциях или документации, которые вы не понимаете; что здесь происходит, так это то, что мы эффективно выполняем вашу домашнюю работу за вас. Вы ничему так не научитесь.

Larnu 01.05.2019 14:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
251
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Использование может использовать 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);

Это решение «Острова» для пробелы и острова, я думаю, что ОП хочет использовать пробелы.

GarethD 01.05.2019 14:23

@ГаретД. . . Спасибо.

Gordon Linoff 01.05.2019 14:28

@GordonLinoff Спасибо! Я пытаюсь найти только пробелы больше 1, например 1996-07-05 -> 1996-07-08, что мне нужно изменить в ГДЕ?

eliad choen 01.05.2019 14:54

@eliadchoen . . . Я заменил <> на >. Вы можете просто настроить 1, чтобы изменить минимальный размер зазора, который вы хотите.

Gordon Linoff 01.05.2019 14:55

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

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;

Другие вопросы по теме