计算前所有行中的NULL值的AVG

时间:2018-12-18 08:40:15

标签: sql sql-server tsql

我有一个包含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值时,前一个为也包括在内(它是经过计算的)...问题是,我不知道如何实现它。

1 个答案:

答案 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