Как получить значение следующей строки на основе предыдущей строки в SQL Server?

#sql-server #sorting #lag #lead

#sql-сервер #сортировка #задержка #вывод

Вопрос:

У меня есть таблица следующего вида,

введите описание изображения здесь

здесь я хочу повторно сгенерировать данные StartDate и EndDate на основе значений NumberOfDaystoAdd и StartDate для последующих строк на основе EndDate 1day предыдущей строки, и в этой последовательности мне нужно исключить даты выходных.

Например, здесь значения 1-й строки правильные, начальная дата второй строки должна быть 2021-03-28, а конечная дата должна быть 2021-03-10.

Я хочу применить логику и выбрать данные в том же запросе select с помощью sql server.

Ожидаемый результат выглядит следующим образом,

введите описание изображения здесь


Пример данных:

Комментарии:

1. Опубликуйте входные данные, желаемые и текущие результаты в виде текста . Изображения нельзя копировать и использовать для тестирования запросов. Поскольку вы уже использовали lag lead теги and , вы пробовали использовать эти методы?

2. Как вы определяете следующий / предыдущий? Основано ли оно исключительно на StartDate значениях? И в настоящее время в этом столбце нет повторяющихся значений?

3. Да @Damien_The_Unbeliever У меня есть таблица с неверными данными, как на первом изображении, я хочу восстановить как 2-е изображение.

4. @PanagiotisKanavos Я пробовал использовать lag методы, но не смог получить точный результат, который я хочу.

Ответ №1:

 declare @t table
(
StartDate date,
EndDate date,
DaysToAdd int
);

insert into @t(StartDate, EndDate, DaysToAdd)
values('20210217', '20210227', 10),
('20210312', '20210310', 10), ('20210326', '20210401', 10), ('20210409', '20210401', 10),
('20210507', '20210401', 10), ('20210606', '20210529', 10),
('20210618', '20210417', 3), ('20210620', '20210309', 2),
('20300913', '20210227', 2), (null, '20300914', 4);


select *
from @t

select
dateadd(day, -DaysToAdd-1 count(*) over(order by isnull(StartDate, EndDate), EndDate)   sum(DaysToAdd) over(order by isnull(StartDate, EndDate), EndDate), min(StartDate) over()) as NewStartDate, 
dateadd(day, -1 count(*) over(order by isnull(StartDate, EndDate), EndDate)   sum(DaysToAdd) over(order by isnull(StartDate, EndDate), EndDate), min(StartDate) over()) as NewEndDate, 
* 
from @t;
 

Комментарии:

1. Спасибо @lptr это решение работает нормально. Но нам нужно исключить выходные и праздничные дни (из праздничной таблицы). Есть ли какое-либо решение? Спасибо ..!