【问题标题】:How to get next row value based on previous row in SQL server?如何根据 SQL Server 中的上一行获取下一行值?
【发布时间】:2021-04-16 06:59:57
【问题描述】:

我有一张如下表,

这里我想根据 NumberOfDaystoAdd 值和 StartDate 重新生成 StartDateEndDate 数据strong> 基于上一行的 EndDate + 1day 的后续行,在这个序列中我需要排除周末日期。

例如, 此处第一行值正确,第二行 startdate 应为 2021-03-28,EndDate 应为 2021-03-10

我想应用逻辑并使用 sql server 在同一个选择查询中选择数据。

预期结果如下,


示例数据:

【问题讨论】:

  • 将输入数据、期望结果和当前结果发布为文本。图像不能被复制并用于测试查询。既然您已经使用了laglead 标签,您是否尝试过使用这些方法?
  • 你如何定义下一个/上一个?它是否纯粹基于StartDate 值?并且该列中当前没有重复值?
  • 是的@Damien_The_Unbeliever 我有一张表,其中第一张图片中的数据有误,我想重新生成为第二张图片。
  • @PanagiotisKanavos 我已尝试使用lag 方法,但无法得到我想要的确切结果。

标签: sql-server sorting lag lead


【解决方案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;

【讨论】:

  • 谢谢@lptr 这个解决方案运行良好。但是我们需要排除周末和假期(从假期表中)。有什么解决办法吗?谢谢..!
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 2014-10-29
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多