У меня есть таблица
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;
которое все еще не легко обобщить на несколько столбцов оценок.