【问题标题】:Calculating AVG for NULL values from all previous rows计算所有先前行的 NULL 值的 AVG
【发布时间】:2018-12-18 08:40:14
【问题描述】:

我有一个这样的 4 列表格:EmployeeID, Date, StartTime, EndTime。前两列不可为空,但其他 2 列是。

我想生成一个报告,并用前几行的 AVG 值填充缺失的 StartTime 和 EndTime。我对 StartTime 列使用以下语句:

ISNULL([StartTime], DATEADD(SECOND, AVG([dbo].[GetTimeInSecondsFromDateTime]([StartTime])) OVER (PARTITION BY [EmployeeID] ORDER BY [Date]), [Date]))

问题是,当我一个接一个地有 2 个 NULL 值时,它们得到相同的值(之前所有值的 AVG),我需要的是:在计算第二个 NULL 值时,前一个是也包括在内(计算出来的)...问题是,我不知道如何实现它。

【问题讨论】:

  • 你有多少行?
  • 发布样本数据和预期输出

标签: sql sql-server tsql


【解决方案1】:

查询未经过测试。希望对你有帮助

因为是空值,建议你先Update By 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

【讨论】:

  • 实际上,从数学上讲,如果我有一个整数数组 [3,6,9,12],则 AVG 将为 7.5。但是 [3,6,9,12,7.5] 的 AVG 又是 7.5 ......所以是的,分区确实有效。
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多