我有一张table
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
有没有办法写得更好?例如,我在想一个例子,你有很多分数列。
根据gordon linoff的建议,我找到了部分解决方案:
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条答案
按热度按时间dz6r00yl1#
只需使用窗口功能:
窗口表达式为:
sum(sum(score)) over ()
计算总分。sum(count(*)) over ()
计算原始数据中的行数。这个比率是总体平均数。
这是一把小提琴。