#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 это решение работает нормально. Но нам нужно исключить выходные и праздничные дни (из праздничной таблицы). Есть ли какое-либо решение? Спасибо ..!