题解 | #SQL21.试卷发布当天作答人数和平均分#

试卷发布当天作答人数和平均分

http://www.nowcoder.com/practice/5b58e89556dc4153a79d8cf8c08ba499

明确题意:

计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score; 按人数降序,相同人数的按平均分升序


问题分解:

  • 获取每张SQL类别试卷发布日期,作为子查询:
    • 筛选试卷类别:WHERE tag = "SQL"
    • 获取试卷ID和发布日期:SELECT exam_id, DATE(release_time)
  • 筛选发布当天的作答记录:WHERE (exam_id, DATE(start_time)) IN (...)
  • 筛选5级以上的用户:AND uid IN (SELECT uid FROM user_info WHERE level > 5)
  • 按试卷ID分组:GROUP BY exam_id
  • 计算作答人数:count( DISTINCT uid ) AS uv
  • 计算平均分(保留1位小数):ROUND(avg( score ), 1) AS avg_score

细节问题:

  • 表头重命名:as
  • 按人数降序,按平均分升序:ORDER BY uv DESC, avg_score ASC

完整代码:

SELECT
    exam_id,
    count( DISTINCT uid ) AS uv,
    ROUND(avg( score ), 1) AS avg_score
FROM exam_record 
WHERE (exam_id, DATE(start_time)) IN (
    SELECT exam_id, DATE(release_time)
    FROM examination_info WHERE tag = "SQL"
) AND uid IN ( SELECT uid FROM user_info WHERE `level` > 5 )
GROUP BY exam_id
ORDER BY uv DESC, avg_score ASC;
SQL进阶 文章被收录于专栏

SQL进阶step by step

全部评论
真服了你们这些喜欢用子查询的,神一般的逻辑思维,动不动就子查询
4 回复 分享
发布于 2022-10-15 19:54 江苏
这样更好理解一点: select exam_id, count(distinct uid) as uv, ROUND(avg(score), 1) as avg_score from exam_record right join examination_info using(exam_id) left join user_info using(uid) where tag = 'SQL' and level > 5 and DATE(release_time) = DATE(submit_time) group by exam_id order by uv desc, avg_score ASC
4 回复 分享
发布于 2022-09-14 11:02 江苏
为什么要写死 WHERE tag = "SQL" 这个条件啊,题目只是举个结果例子
3 回复 分享
发布于 2022-06-10 15:24
这题感觉连表更清楚
2 回复 分享
发布于 2023-03-11 11:19 广东
为什么round(sum(score)/count(distinct uid),1)不行??
1 回复 分享
发布于 2023-04-10 20:01 广东
请问为啥要按试卷id分组 还要进行排升降序呀?
1 回复 分享
发布于 2022-04-10 10:21
嘿嘿 和楼主写的一样,一样聪明
点赞 回复 分享
发布于 03-26 14:05 上海
'SQL'下的不同难度难道不是另一个类别的试卷吗?
点赞 回复 分享
发布于 2023-08-16 13:53 浙江
请问,发布当天的时间,三门试卷的release_time都不一样,不就通过发布时间直接筛选出SQL类别的试卷了吗?为什么还要加上条件where tag = 'SQL'呢?
点赞 回复 分享
发布于 2023-02-17 20:15 辽宁
为什么没有date(release_time) = date(register_time)? 请计算每张SQL类别试卷发布后,"当天"5级以上的用户作... 用户在试卷发布后才登记的不算,是这样理解吗?
点赞 回复 分享
发布于 2022-11-26 15:22 澳门
WHERE (exam_id, DATE(start_time)) IN ( SELECT exam_id, DATE(release_time) FROM examination_info WHERE tag = "SQL" 请问这里的date函数是对前边exam_id有约束的吗?
点赞 回复 分享
发布于 2022-07-03 22:09
请问题目中的数据改了吗,按上述代码,示例结果和执行结果一致,但是按逻辑来看,示例结果示错误的😥
点赞 回复 分享
发布于 2022-06-07 10:57
select er.exam_id,count(distinct er.uid) as uv, round(avg(score),1) as avg_score from exam_record er join examination_info ei on er.exam_id=ei.exam_id where uid in(select uid from user_info where level >5) and ei.tag='SQL' and date(ei.release_time)=date(er.submit_time) group by er.exam_id order by uv desc, avg_score
点赞 回复 分享
发布于 2022-02-08 15:00

相关推荐

不愿透露姓名的神秘牛友
07-02 15:39
点赞 评论 收藏
分享
06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
07-01 19:00
门头沟学院 Java
点赞 评论 收藏
分享
评论
80
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务