牛客网刷题学习SQL(二)

SQL22 统计每个学校的答过题的用户的平均答题数

描述
运营想要了解每个学校答过题的用户平均答题数量情况,请你取出数据。

用户信息表 user_profile,其中device_id指终端编号(认为每个用户有唯一的一个终端),gender指性别,age指年龄,university指用户所在的学校,gpa是该用户平均学分绩点,active_days_within_30是30天内的活跃天数。
device_id gender
age
university gpa active_days_within_30
2138 male 21 北京大学 3.4 7
3214
male NULL 复旦大学 4 15
6543 female 20 北京大学 3.2 12
2315 female 23 浙江大学 3.6 5
5432 male 25 山东大学 3.8 20
2131 male 28 山东大学 3.3 15
4321 male
28 复旦大学 3.6 9
第一行表示:用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4,在过去的30天里面活跃了7天
最后一行表示:用户的常用信息为使用的设备id为4321,性别为男,年龄28岁,复旦大学,gpa为3.6,在过去的30天里面活跃了9天

答题情况明细表 question_practice_detail,其中question_id是题目编号,result是答题结果。
device_id question_id result
2138 111 wrong
3214 112 wrong
3214 113
wrong
6543 111 right
2315 115 right
2315 116 right
2315 117 wrong
5432 118 wrong
5432 112 wrong
2131 114 right
5432 113 wrong

第一行表示用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误

最后一行表示用户的常用信息为使用的设备id为5432,在question_id为113的题目上,回答错误

请你写SQL查找每个学校用户的平均答题数目(说明:某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数)根据示例,你的查询应返回以下结果(结果保留4位小数),注意:结果按照university升序排序!!!

university avg_answer_cnt
北京大学 1.0000
复旦大学 2.0000
山东大学 2.0000
浙江大学 3.0000

解释:
第一行:北京大学总共有2个用户,2138和6543,2个用户在question_practice_detail里面答了2题,平均答题数目为2/2=1.0000

最后一行:浙江大学总共有1个用户,2315,这个用户在question_practice_detail里面答了3题,平均答题数目为3/1=3.0000

select university,
    count(question_id)/count(distinct qpd.device_id) avg_answer_cnt
from question_practice_detail qpd  
left join user_profile up
on qpd.device_id=up.device_id
group by university

# group by university 按学校区分
# count(distinct qpd.device_id) 统计每个学校的总用户,注意:由于两个表都有device_id所以这里需要指出是哪一个
# count(question_id) 统计每个学校总答题的记录数

# select university,
#     count(question_id) / count(distinct qpd.device_id) as avg_answer_cnt
# from question_practice_detail as qpd
# inner join user_profile as up
# on qpd.device_id=up.device_id
# group by university

==注意:==虽然上面sql返回的结果正确但是这并不意味着就是正确的。
==原因:==题目中提到结果按照university升序排序!!!
所以代码中需要添加一句order by语句

select university,
    count(question_id)/count(distinct qpd.device_id) avg_answer_cnt
from question_practice_detail qpd  
left join user_profile up
on qpd.device_id=up.device_id
group by university
order by avg_answer_cnt asc;

总结一下:

该题考查distinct、join on、left join on、inner join on 、group by、order by这些关键词的使用

去重Distinct

  1. SELECT DISTINCT语句的作用是查询指定列的所有不同的值,并将其作为结果集返回。也就是说,如果一个表中某个字段有多个重复的值,使用SELECT DISTINCT语句可以去除这些重复的值,只返回该字段的不同值。使用SELECT DISTINCT语句可以方便地对数据进行去重处理,避免重复数据造成的混淆和误操作

按某种属性排序查询 ORDER BY

  1. ORDER BY是SQL语句中的一个关键字,用于对查询结果进行排序。它可以对查询结果中的一个或多个字段进行升序或降序排序。ORDER BY的基本语法如下:

    SELECT column1, column2, … FROM table_name ORDER BY column_name [ASC|DESC];

    其中,column1、column2等是要查询的字段,table_name是要查询的表名,column_name是要排序的字段名。ASC表示升序排序,DESC表示降序排序。默认情况下,ORDER BY按升序排序。

    例如,要查询一个学生表,按成绩从高到低排序,可以写成:

    SELECT name, score FROM student ORDER BY score DESC;

    这样可以将查询结果按照成绩从高到低排序,方便查看学生的排名情况

猜你喜欢

转载自blog.csdn.net/qq_53037676/article/details/130937952