SQL 求平均值时去掉极值
时间:2022-07-24
本文章向大家介绍SQL 求平均值时去掉极值,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在一些比赛中,为了公平起见,算法端会在评委给出的分数里面去掉一个最高分和一个最低分,再求平均分,平均分即是选手的最后得分。
在某次比赛中,评委给选手 A 打出了一组分数:98、88、94、92、95、93、92,我们怎么用 SQL 来计算选手 A 的最后得分呢?
假设评委打出的分数存储在 t 表的 score 字段里面。
方案一
找到最高分和最低分,将最高分和最低分从分数组中剔除。
使用 max()
和 min()
函数可以分别找到最高分和最低分。
具体的 SQL 实现如下:
SELECT
AVG(score) AS final_score
FROM
t
WHERE score NOT IN (
(SELECT
MIN(score)
FROM
t),
(SELECT
MAX(score)
FROM
t)
)
上面的 SQL 还存在一点问题,当最高分或者最低分的分值存在多个时,使用这个方法计算出来的最后得分是不对的。
方案二
先对所有的分数求和,再减去最高分和最低分,最后求平均值。
SELECT
(SUM(score) - MIN(score) - MAX(score)) /
(COUNT(*) - 2) AS final_score
FROM
t
即使存在重复的最高分或最得分,用这个方法计算出来的最后得分也是正确的。
方案三
如果数据库支持窗口函数,可以用窗口函数对分值分别按升序和降序排序(分值相同的序号也不同),去掉序号为 1 的记录再求平均值。
SELECT
AVG(score) AS final_score
FROM
(SELECT
score,
row_number () over (
ORDER BY score) score_asc_rn,
row_number () over (
ORDER BY score DESC) score_desc_rn
FROM
t) t
WHERE score_asc_rn > 1
AND score_desc_rn > 1
封面图片由 Юрий Сидоренко 在 Pixabay 上发布。
- Eclipse中Maven打包程序并在Linux中运行
- SDN开发笔记(七):L2switch源码分析(上)
- spark使用zipWithIndex和zipWithUniqueId为rdd中每条数据添加索引数据
- Spring Boot Server容器配置
- Spring Boot读取配置的几种方式
- 如何用TensorFlow构建RNN?这里有一份极简的教程
- (1024程序员节快乐)阿里祭出大器,Java代码检查插件
- Java多线程神器:join使用及原理
- SpringCloud配置中心内容加密
- Spring Boot日志集成
- MongoDB系列7:MongoDB存储引擎
- MongoDB系列6:MongoDB索引的介绍
- 文本数据处理的终极指南-[NLP入门]
- 神经网络思想建立LR模型(DL公开课第二周答案)
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解