子查询
浙江大学用户题目回答情况
题目:现在运营想要查看所有来自浙江大学的用户题目回答明细情况,请你取出相应数据
示例:question_practice_detail
id device_id question_id result 1 2138 111 wrong 第一行表示:id为1的用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误
示例:user_profile
id device_id gender age university gpa active_days_within_30 question_cnt answer_cnt 1 2138 male 21 北京大学 3.4 7 2 12 第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4,在过去的30天里面活跃了7天,发帖数量为2,回答数量为12
根据示例,你的查询应返回以下结果,查询结果根据question_id升序排序:
device_id question_id result 2315 115 right
- 两个表 根据
device_id关联, 题目需要我们聚合qpd表的question_id和result字段 条件是up表的university是浙江大学 - 第一时间没有想到
子查询, 直接使用JOIN ON了
|
|
子查询代码如下
|
|
链接查询
统计每个学校的答过题的用户的平均答题数
题目:查找每个学校用户的平均答题数目(某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数)
表结构说明:
user_profile 用户信息表:
- device_id:终端编号(每个用户有唯一的一个终端)
- gender:性别
- age:年龄
- university:用户所在的学校
- gpa:该用户平均学分绩点
- active_days_within_30:30天内的活跃天数
question_practice_detail 答题情况明细表:
- question_id:题目编号
- result:答题结果
示例数据:
user_profile:
device_id gender age university gpa active_days_within_30 2138 male 21 北京大学 3.4 7 question_practice_detail:
device_id question_id result 2138 111 wrong 要求:计算每个学校用户的平均答题数目(答题总次数/答过题的不同用户数),结果保留4位小数,按university升序排序
预期输出示例:
university avg_answer_cnt 北京大学 1.0000
题目要求
- 根据
up表的university聚合出qpd表中 每所大学的 平均答题数, 即university对应有的device_id总共有多少个记录在qpd表中 - 这里有一个逻辑坑点 ,
distinct up.device_id一开始认为device_id必然是唯一的 。但是我们join on之后,由于qpd表的device_id是有多个的,所以我们最后用于计算的分母需要DISTINCT
|
|
统计每个学校各难度的用户平均刷题数
以下是修复后的Markdown内容,保持引用格式,优化了表格展示和换行:
题目:运营想要计算一些参加了答题的不同学校、不同难度的用户平均答题量,请你写SQL取出相应数据
用户信息表:user_profile
id device_id gender age university gpa active_days_within_30 question_cnt answer_cnt 1 2138 male 21 北京大学 3.4 7 2 12 题库练习明细表:question_practice_detail
id device_id question_id result 1 2138 111 wrong 表:question_detail
id question_id difficult_level 1 111 hard 请你写一个SQL查询,计算不同学校、不同难度的用户平均答题量,根据示例,你的查询应返回以下结果(结果在小数点位数保留4位,4位之后四舍五入):
university difficult_level avg_answer_cnt 北京大学 hard 1.0000
题目要求 :
- 首先需要
up表的university - 另外需要
qd表的diffcult - 其次需要计算
count(same-diffcult-question) / count(same-university-device-id)
思路 :
- 对于三张表的查询 , 我们先优化到 两张表的查询,
拆子问题, 我们可以先聚合qd和qpd这两张表 , 知道每个题目的难度 - 相当于我们聚合了一张
带有难度信息的 qpd - 然后我们使用 这个
new qpd再去和UP聚合计算一下 对应的question_id/device_id group by (university, diffcult)即可
|
|
组合查询
查找山东大学或者性别为男生的信息
以下是修复后的Markdown内容,保持引用格式并优化表格展示:
题目:现在运营想要分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,请取出相应结果,结果不去重。
示例:user_profile
id device_id gender age university gpa active_days_within_30 question_cnt answer_cnt 1 2138 male 21 北京大学 3.4 7 2 12 根据示例,你的查询应返回以下结果(注意输出的顺序,先输出学校为山东大学再输出性别为男生的信息):
device_id gender age gpa 5432 male 25 3.8
题目要求 :
- 连续查两遍这个表, 第一遍是
山东大学, 第二遍是男性然后组合输出
思路 :
-
一开始以为是
SELECT WHERE OR的形式,但是发现 2. 第一, 不能查重复数据 ,即山东大学和male如果是一条数据,应该查出两条 3. 第二不好排序,因为UNIVERSITY -
这题纯属新知识点
UNION ALL不去除重复数据 ,UNOIN去除重复数据
|
|
留坑
JOIN,LEFT JOIN,RIGHT JOIN- 子查询 ,
视图的概念 UNION ALL的性能 ,业务上的使用