SQL Server CTE使用上一个计算日期作为下一个开始日期

时间:2017-05-23 21:03:42

标签: sql-server

我有一张表可以保存任务。每个任务都有一个分配的小时数,它应该用来完成任务。

我将数据存储在表格中,如下所示:

declare @fromtable table (recordid int identity(1,1), orderdate date, deptid int, task varchar(500), estimatedhours int);

我还有一个根据开始日期,估计小时数和部门计算任务完成日期的函数,以及计算人数,工作时间等的其他数学计算等。

dbo.fn_getCapEndDate(aStartDate,estimatedHours,deptID)

我需要为@fromtable中的每条记录生成开始日期和结束日期。第一个记录将以列orderdate作为计算的开始日期开始,然后每个后续记录将使用前一个记录的computedEndDate作为其开始日期。

我想要实现的目标:

enter image description here

以下是我的开始:

with MyCTE as
(
   select mt.recordID, mt.deptID, mt.estimatedhours, mt.JobNumber, ROW_NUMBER() over (order by recordID) as RowNum,
   convert(date,mt.orderdate) as computedStart, 
   case when mt.recordID = 1 then convert(date,dbo.fn_getCapEndDate(mt.orderdate,mt.estimatedhours,mt.deptid)) end as computedEnd
   from @fromtable mt  
)

select c1.*, c2.recordID, 
case when c2.recordid is null then c1.computedStart else c2.computedEnd end as StartDate,
case when c2.recordid is null then c1.computedEnd else dbo.fn_getCapEndDate(c2.computedEnd,c1.estimatedhours,c1.deptid) end as computedEnd
from MyCTE c1
left join MyCTE c2 on c1.RowNum = c2.RowNum + 1;

这样,前两列具有正确的开始/结束日期。之后的每一列都为其起始值和结束值计算NULL。它失去了"前一列的计算结束日期的值。

如何解决问题并根据需要返回值?

编辑:文本格式的示例数据:

estimatedhours  OrderDate
0    1/1/2017
0    1/1/2017
0    1/1/2017
0    1/1/2017
500  1/1/2017
32   1/1/2017
0    1/1/2017
0    1/1/2017
320  1/1/2017
0    1/1/2017
5    1/1/2017
0    1/1/2017
4    1/1/2017

1 个答案:

答案 0 :(得分:1)

您可以使用以下链接:

select RecordId, EstimatedHours, StartDate,
   ComputedEnd = LEAD(StartDate) over (order by RecordId)
From yourTable