SQL: отклонение от среднего в процентах - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица

student class score
--------------------
A        1       6
B        1       5
C        2       6

Я хотел бы вычислить в SQL процентное отклонение баллов каждого класса от среднего значения баллов во всех классах; другими словами

(avg_score_in_one_class- avg_score_all_classes)/avg_score_all_classes *100

Я вычислил его с помощью SQL, используя этот запрос

SELECT 
class, 
(AVG(score) - (SELECT AVG(score) FROM table))
/
(SELECT AVG(score) FROM table)
*100
FROM table
GROUP BY class

Результат должен быть

class deviation
---------------
1      -2.9411764705882404
2      5.882352941176465

Есть ли способ напиши лучше? Например, я думал о случае, когда у вас много столбцов с очками.

Следуя предложению Гордона Линоффа, я нашел частичное решение:

WITH temp_table as 
(
    SELECT
        class,
    AVG(score) OVER (PARTITION by class) as avg_class,
    AVG(score) OVER () as avg_score
    FROM table
)

SELECT
    class,
AVG((avg_class-avg_score)/avg_score*100.0) as dev
FROM temp_table
GROUP BY class;

которое все еще не легко обобщить на несколько столбцов оценок.

1 Ответ

1 голос
/ 26 мая 2020

Просто используйте функции окна:

select class, avg(score) as class_avg,
       (avg(score) * 100.0 / ( sum(sum(score)) over () / sum(count(*)) over () )) - 100.0 as deviation_from_overall_average
from t
group by class;

Выражения окна:

  • sum(sum(score)) over () вычисляет общую сумму баллов.
  • sum(count(*)) over () вычисляет количество строк в исходных данных.

Отношение является общим средним.

Здесь - скрипт db <>.

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