牛客刷题-SQL篇

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

题目:从exam_record数据表中计算所有用户完成SQL类别高难度试卷得分的截断平均值(去掉一个最大值和一个最小值后的平均值)。

即得出下面这个结论:

注:示例数据中exam(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间)

exam表内容如下:

idexam_idtagdifficultydurationrelease_time
19001SQLhard602020-01-01 10:00:00
29002算法medium802020-08-02 10:00:00

注:示例数据:exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)

exam_record表内容如下

idexam_idstart_timesubmit_timescore
190012020/1/2 9:012020/1/2 9:2180
290012021/5/2 10:012021/5/2 10:3081
390012021/6/2 19:012021/6/2 19:3184
490022021/9/5 19:012021/9/5 19:4089
590012021/9/2 12:01(null)(null)
690022021/9/1 12:01(null)(null)
790022021/2/2 19:012021/2/2 19:3087
890012021/5/5 18:012021/5/5 18:5990
990012021/9/7 12:012021/9/7 10:3150
1090012021/9/6 10:01(null)(null)

select tag,difficulty,round(((sum(score)-max(score)-min(score))/(count(score)-2)),1) as avg_score
from exam,exam_record
where exam.exam_id = exam_record.exam_id
and score not in ('(null)')
group by exam_record.exam_id
having count(exam_record.exam_id)>3

执行运行结果如下:

2.满足条件的用户的试卷完成数和题目练习数

题目:找到高难度SQL试卷得分平均值大于80并且是7级的红名大佬,统计他们的2021年试卷总完成次数和题目总练习次数,只保留2021年有试卷完成记录的用户。结果按试卷完成数升序,按题目练习数降序。展示如下:

注:用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间):

注:试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间): 

注:试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):

 注:题目练习记录表practice_record(uid用户ID, question_id题目ID, submit_time提交时间, score得分):

WITH a AS ( SELECT uid, count( exam_id ) AS exam_cnt FROM exam_record GROUP BY uid ),
c AS (
	SELECT
		uid 
	FROM
		exam_record
		JOIN examination_info USING ( exam_id )
		JOIN user_info USING ( uid ) 
	WHERE
		tag = 'SQL' 
		AND LEVEL = 7 
	GROUP BY
		uid 
	HAVING
		avg( score ) > 80 
	) SELECT
	c.uid,
	exam_cnt,
IF
	( question_cnt1 IS NULL, 0, question_cnt1 )  as question_cnt
FROM
	a,
	c
	LEFT JOIN ( SELECT uid, count( question_id ) AS question_cnt1 FROM practice_record GROUP BY uid order by question_cnt1 desc) AS b ON b.uid = c.uid 
WHERE
	a.uid = c.uid
order by exam_cnt asc

执行结果如下:

3.每个6/7级用户活跃情况

 现有用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间):

iduidnick_nameachievementleveljobregister_time
11001牛客1号31007算法2020-01-01 10:00:00
21002牛客2号23007算法2020-01-01 10:00:00
31003牛客3号25007算法2020-01-01 10:00:00
41004牛客4号12005算法2020-01-01 10:00:00
51005牛客5号16006C++2020-01-01 10:00:00
61006牛客6号26007C++2020-01-01 10:00:00

试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间):

idexam_idtagdifficultydurationrelease_time
19001SQLhard602021-09-01 06:00:00
29002C++easy602021-09-01 06:00:00
39003算法medium802021-09-01 10:00:00

试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):

uidexam_idstart_timesubmit_timescore
100190012021-09-01 09:01:012021-09-01 09:31:0078
100190012021-09-01 09:01:012021-09-01 09:31:0081
100590012021-09-01 19:01:012021-09-01 19:30:0185
100590022021-09-01 12:01:012021-09-01 12:31:0285
100690032021-09-07 10:01:012021-09-07 10:21:5984
100690012021-09-07 10:01:012021-09-07 10:21:0181
100290012020-09-01 13:01:012020-09-01 13:41:0181
100590012021-09-01 14:01:01(NULL)(NULL)

题目练习记录表practice_record(uid用户ID, question_id题目ID, submit_time提交时间, score得分):

uidquestion_idsubmit_timescore
100180012021-08-02 11:41:0160
100480012021-08-02 19:38:0170
100480022021-08-02 19:48:0190
100180022021-08-02 19:38:0170
100480022021-08-02 19:48:0190
100680022021-08-04 19:58:0194
100680032021-08-03 19:38:0170
100680032021-08-02 19:48:0190
100680032020-08-01 19:38:0180

请统计每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数,按照总活跃月份数、2021年活跃天数降序排序。由示例数据结果输出如下:

uidact_month_totalact_days_2021act_days_2021_examact_days_2021_question
10063413
10012211
10051110
10021000
10030000

解释:6/7级用户共有5个,其中1006在202109、202108、202008共3个月活跃过,2021年活跃的日期有20210907、20210804、20210803、20210802共4天,2021年在试卷作答区20210907活跃1天,在题目练习区活跃了3天。

我的答案如下(经过Mysql数据库验证,欢迎大家交流):

select user_info.uid as uid,
	count(distinct act_month) as act_month_total,
	count(distinct case when year(act_days)='2021' then act_days end) as act_days_2021,
	count(distinct case when year(act_days)='2021' and a='exam' then act_days end) as act_days_2021_exam,
	count(distinct case when year(act_days)='2021' and a='practice' then act_days end) as act_days_2021_practice
from user_info
left join 
(select uid,date_format(start_time,'%Y%m') as act_month,date_format(start_time,'%Y%m%d') as act_days,'exam' as a from exam_record
union
select uid,date_format(submit_time,'%Y%m') as act_month,date_format(submit_time,'%Y%m%d') as act_days,'practice' as a from practice_record) as b on b.uid = user_info.uid
where level >= 6
group by uid
order by act_month_total desc,act_days_2021 desc

运行数据库,看一下结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值