sql - SQL:与平均值的百分比偏差
问题描述
我有一张桌子
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;
这仍然不能简单地推广到多个分数列。
解决方案
只需使用窗口函数:
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<>fiddle。
推荐阅读
- php - 如何在点击时从 $_SESSION 中删除特定数据
- azure-devops - 将自定义图像应用于使用自定义图像创建的现有 azure scaleset
- android - 在android/app/build.gradle(React Native ap)中动态填充一些数据
- node.js - 无法安装 wdio-jasmine-framework
- python - 如何使用 pdfkit 将图像添加到 wkhtmltopdf 中的标题?
- python - 如何在 Qt5 中调整父级大小后调整方形子级小部件的大小?
- python - 使用 psycopg2 和 POSTGRESQL 在 Python 中为 SELECT 查询的可选参数更正函数定义
- python - 有没有办法打包一个简单的 Python 项目并让它通过 Internet 执行安装
- cloud - Openstack——如何使用云资源
- reactjs - Differents drawer navigator for each user type in React Native