题解 | #SQL14 SQL类别高难度试卷得分的截断平均值#

SQL类别高难度试卷得分的截断平均值

http://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45

明确题意:

计算所有用户完成SQL类别高难度试卷得分的截断平均值(去掉一个最大值和一个最小值后的平均值)


问题分解:

  • 关联作答记录和试卷信息:join examination_info using(exam_id);
  • 筛选SQL高难度试卷:where tag="SQL" and difficulty="hard"
  • 计算截断平均值:(和-最大值-最小值) / (总个数-2): (sum(score) - max(score) - min(score)) / (count(score) - 2)

细节问题:

  • 表头重命名:as
  • 保留1位小数:round(..., 1)

完整代码:

select tag, difficulty,
    round((sum(score) - max(score) - min(score)) / (count(score) - 2), 1) as clip_avg_score
from exam_record
join examination_info using(exam_id)
where tag="SQL" and difficulty="hard"
SQL进阶 文章被收录于专栏

SQL进阶step by step

全部评论
补充: 聚集函数关于NULL值的处理:除了count(*)之外的其他聚集函数(包括count(column-name), sum(), avg(), max(), min())都只操作non-NULL的值。 count(1)和count(*)在mysql中没有区别,无论是结果还是性能都是相同的。 SELECT FORMAT(1234.4476566555,5) # 输出为1,234.44766,四舍五入,返回类型是字符串,所以会自动加逗号 SELECT ROUND(1234.4476566555,5) # 输出为1234.44766,四舍五入,FORMAT和ROUND功能一样,都是四舍五入,但是FORMAT会自动加逗号,而ROUND不会。
12 回复 分享
发布于 2022-03-08 09:17
我还在想,如何去掉最高值和最低值,原来直接减掉就完事了…… 思维严重僵化了
11 回复 分享
发布于 2022-06-26 18:01
最大值或者最小值有多个就不行,有多个试卷就不行,这是根据答案倒推的
6 回复 分享
发布于 2022-08-27 15:53 广东
这个using学到了
6 回复 分享
发布于 2021-12-28 16:10
老哥们,你们自己做题大概一道中等或者较难的题目要花多久阿?我新手第一次刷题,自己做加查查忘记了的函数用法,最快也要快20分钟才做对一题啊。
6 回复 分享
发布于 2021-11-23 22:44
如果只有2条数据 count(score) - 2 = 0 sql是不是就出问题了
3 回复 分享
发布于 2022-02-16 14:00
求教,怎么能确定这里最大值或者最小值都只有一个呢,如果有两个一样的最大值会怎么样呢,不影响吗
2 回复 分享
发布于 2022-01-20 13:09
为什么这个题解 运行出来只有一行记录,不是应该多个重复行吗。 没理解不适用groupby的情况下为什么如此
2 回复 分享
发布于 2022-01-06 20:36
请问为什么分母不能count(er.exam_id)呢 是因为需要排除score为null的吗
2 回复 分享
发布于 2021-12-22 14:14
高!实在是高!
点赞 回复 分享
发布于 04-21 17:00 山东
最高和最低分不一定只有2个吧,虽然这个题是2个,但实际业务中有重复的才是常见情况。
点赞 回复 分享
发布于 2024-12-26 14:53 浙江
大佬逻辑严谨,牛逼
点赞 回复 分享
发布于 2024-06-24 18:52 重庆
这种方式不能处理最高最低分有多个user的情况啊
点赞 回复 分享
发布于 2024-06-21 11:05 山东
我的解法(写复杂了): https://paste.ubuntu.com/p/xhH5vzbH2v/ 这里我有个问题,为什么像上面的ROUND(AVG(score),1)不会触发only_full_group_by错误?而下面代码却会? https://paste.ubuntu.com/p/HFSwr3w5ZF/ 我的理解是这样的,前面代码是在全表上聚合是可以的,后面代码T表试图输出每一行和全表上的聚合MIN和MAX,这样是不可以的,MySQL要么只输出每一行数据,要么只输出分组的结果.有没有其他的或者更深入的解释帮我理解一下only_full_group_by?为什么第一个的代码有tag和difficulty却不会触发only_full_group_by错误(虽然没有GROUP BY 子句)?但第二个代码的T表触发only_full_group_by错误(也没有GROUP BY子句)
点赞 回复 分享
发布于 2024-04-14 13:21 甘肃
select ei.tag, ei.difficulty, round((sum(er.score) - max(er.score) - min(er.score)) / (count(er.score) - 2),1) from exam_record er left join examination_info ei on er.exam_id=ei.exam_id where tag='SQL' and difficulty='hard' group by ei.tag,ei.difficulty 需要分组的 分组也能通过 但是应该是数据只有一条sql的要是有两条就报错额
点赞 回复 分享
发布于 2023-02-27 22:47 广东
select tag,difficulty,round((sum(score)-min(score)-max(score))/(count(*)-2),1) clip_avg_score from examination_info left join exam_record er on examination_info.exam_id = er.exam_id where difficulty='hard'and score is not null; 这个我在软件上能运行在牛客上报错大佬救救
点赞 回复 分享
发布于 2022-11-01 20:47 江西
我用left join 连接两表有什么问题吗?examination_info left join exam_record using(exam_id) 结果不对
点赞 回复 分享
发布于 2022-10-29 15:51 山东
我奇怪的是 ,为什么 试卷难度等级需要where语句查询, where语句已经筛选出收起来了并且只有sql是困难,不是就可以自动检索diffi对应的是困难吗
点赞 回复 分享
发布于 2022-09-20 21:40 广西
所以说是不是在对所有数据进行聚合的时候,添加别的字段的话,可以在where的条件里面添加就可以了啊
点赞 回复 分享
发布于 2022-09-11 20:06 浙江
这个写法固定了科目,如果存在多个科目就不行了,题目写的至少有3个有效分数,我认为应该是有效分数大于3个的都应该出来
点赞 回复 分享
发布于 2022-07-26 14:50

相关推荐

刘湘_passion:太强了牛肉哥有被激励到
点赞 评论 收藏
分享
被加薪的哈里很优秀:应该继续招人,不会给你留岗位的
点赞 评论 收藏
分享
评论
275
24
分享

创作者周榜

更多
牛客网
牛客企业服务