使用空值计算移动平均值
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...你可以选择你的默认值。
我有一个按年份和子组划分的学校毕业数据集,并提供了分子和分母以及单年毕业率,但我还需要计算 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...你可以选择你的默认值。