我有一个包含4列的表格,例如:EmployeeID, Date, StartTime, EndTime
。前两列不可为空,而其他两列则不能为空。
我想生成一个报告,并使用前一行的AVG值填充缺少的StartTime和EndTime。我在StartTime列中使用了以下语句:
ISNULL([StartTime], DATEADD(SECOND, AVG([dbo].[GetTimeInSecondsFromDateTime]([StartTime])) OVER (PARTITION BY [EmployeeID] ORDER BY [Date]), [Date]))
问题是,当我一个接一个地具有2个NULL值时,它们得到相同的值(来自先前所有值的AVG),而我需要的是:在计算第二个NULL值时,前一个为也包括在内(它是经过计算的)...问题是,我不知道如何实现它。
答案 0 :(得分:1)
未经测试的查询。希望对您有帮助
由于有空值,建议您先按StartTime更新
UPDATE t1
SET StartTime = ISNULL(StartTime, t2.AvgStartTime)
FROM yourTable t1
JOIN (
SELECT
EmployeeID,
Date,
Avg(StartTime) OVER(ORDER BY Date Asc) As AvgStartTime,
FROM yourTAble
) t2 ON t1.EmployeeID = t2.EmployeeID
Where
t1.StartTime is null
然后选择结束时间
UPDATE t1
SET EndTime = ISNULL(EndTime, t2.AvgEndTime)
FROM yourTable t1
JOIN (
SELECT
EmployeeID,
Date,
Avg(EndTime) OVER(ORDER BY Date Asc) As AvgEndTime,
FROM yourTAble
) t2 ON t1.EmployeeID = t2.EmployeeID
Where
t1.EndTime is null