Рассчитать скользящее среднее с нулевыми значениями - PullRequest
0 голосов
/ 15 июня 2019

У меня есть данные об окончании школы по годам и подгруппам, мне были предоставлены числитель и знаменатель, а также коэффициент выпуска за один год, но мне также необходимо рассчитать скользящее среднее за 3 года.Статистик, который больше не работает с нами, сообщил мне, что для этого мне нужно получить промежуточную сумму для числителя за 3 года и промежуточную сумму за 3 года для знаменателя.Я понимаю математику и проверил свою работу вручную и через Excel с несколькими подгруппами.Я также рассчитал это с использованием T-SQL без проблем, если нет нулевых записей, но я борюсь с вычислением, когда есть нули или 0.

Я попытался запустить запрос с учетом нуляиспользуя NULLIF

   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

Первый вопрос, мне предоставили запись для всех подгрупп, даже если у них не было учеников в подгруппе.Я хочу вести учет, чтобы все подгруппы учитывались в округе, и, поскольку я знаю, что у них нет данных, могу ли я заменить нулевые значения в Tgrads, TStus на 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 Ответ

0 голосов
/ 15 июня 2019

Ответ на вопрос 1: поставить в условие выбора

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" ...Вы можете выбрать значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...