我有一张表可以保存任务。每个任务都有一个分配的小时数,它应该用来完成任务。
我将数据存储在表格中,如下所示:
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作为其开始日期。
我想要实现的目标:
以下是我的开始:
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
答案 0 :(得分:1)
您可以使用以下链接:
select RecordId, EstimatedHours, StartDate,
ComputedEnd = LEAD(StartDate) over (order by RecordId)
From yourTable