sql:与平均值的百分比偏差

66bbxpm5  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(419)

我有一张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;

但要将其推广到多个分数列仍然不容易。

dz6r00yl

dz6r00yl1#

只需使用窗口功能:

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 () 计算原始数据中的行数。
这个比率是总体平均数。
这是一把小提琴。

相关问题