使用空值计算移动平均值

Calculate moving average with null values

我有一个按年份和子组划分的学校毕业数据集,并提供了分子和分母以及单年毕业率,但我还需要计算 3 年移动平均值。一位不再与我们合作的统计学家告诉我,要做到这一点,我需要获得 3 年分子的 运行 总数和 3 年分母的 运行 总数。我了解其背后的数学原理,并通过 excel 与几个小组一起手动检查了我的工作。我也使用 T-SQL 计算过这个,只要没有空记录就没有问题,但是当有空值或 0.

时我正在努力计算

我已经尝试 运行 使用 NULLIF

来查询 null
   ID,
   Bldg,
   GradClass,
   Sbgrp ,
   TGrads,
   TStus,
   Rate,
/*Numerator Running total*/
   SUM (TGrads) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) AS NumSum,
/*Denominator Running Total*/
   SUM ( TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) AS DenSum,
/*Moving Year Average*/
   (
       ( SUM ( TGrads) OVER ( partition BY DistrictID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) ) / NULLIF ( ( SUM ( TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) ), 0 ) * 100 
   ) AS 3yrAvg 
FROM
   KResults.DGSRGradBldg

第一个问题,我得到了所有子组的记录,即使他们在子组中没有学生。我想保留记录,以便所有子组都包含在该地区内,并且由于我知道他们没有数据,我可以用 0 替换 Tgrads 和 TStus 中的 Null 值吗?如果我用 0 替换这些值,我如何才能将费率显示为空值?

第二个问题如何计算分母为空或 0 的比率?我知道你不能除以 0,但我想保留记录,以便很容易清楚地看到他们没有数据。我怎样才能做到这一点?当我尝试在不考虑 Null 的情况下进行计算时,我得到了错误,1.) 除以零时遇到错误。 (8134) 和 2.) 聚合或其他 SET 操作消除了空值。 (8153)。

知道我不能除以 0 或 Null,我修改了我的查询以包含 NULLIF,当我这样做时,查询运行没有错误,但我没有得到低于 100% 的准确百分比。我所有的利率现在不是 100% 就是 0 - 请注意最后一行,2/3 的移动平均值不是 0。

如果我尝试考虑空值,则数据如下所示,我的三年移动平均值显示为 0。请注意,三年移动平均值列显示全部为 0。

ID   Bldg    Class   Sbggrp  TGrads  TStus      Rate    NumSum DenSum  3yrAvg  
A    1      2014       A1    46      49         93.9    46     49       0
A    1      2015       A1    41      46         89.1    87     95       0
A    1      2016       A1    47      49         95.9    134    144      0
A    1      2017       A1    38      40         95.0    126    135      0
A    1      2018       A1    59      59         98.3    143    148      0
A    1      2014       A2    1       1          100     1      1        100
A    1      2015       A2                               1      1        100
A    1      2016       A2                               1      1        100
A    1      2017       A2    2       3          66.7    2      3        0
A    1      2018       A2    2       2          100     4      5        0

任何建议将不胜感激,但请向这位新手提供建议。 感谢您的时间和帮助。

问题1的答案:放入select条件

ISNULL(TGrads,0) AS TGRADS,
ISNULL(TStus,0) AS TSTUS,

问题 2 的答案:我会这样做

(CASE WHEN SUM(TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) IS NOT NULL
AND SUM(TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) <>0
THEN (SUM(TGrads) OVER ( partition BY DistrictID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row )  / (SUM(TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) ) ) * 100
ELSE NULL END
   ) AS 3yrAvg 

我在"ELSE"后面放了null...你可以选择你的默认值。