做题笔记:SQL Sever 方式做牛客SQL的题目--VQ29

----VQ29 验证刷题效果,输出题目真实通过率

牛客刷题记录表done_questions_record,为验证重复刷题率,需要我们查找一些数据:

question_pass_rate 表示每个用户不同题目的通过率(同一用户同一题重复提交通过仅计算一次);

pass_rate 表示每个用户的提交正确率(只要有提交一次即计算一次);

question_per_cnt表示平均每道不同的题目被提交的次数(只要有一次提交即计算一次)。

请你输出题目通过率 question_pass_rate > 60% 的用户的提交正确率 pass_rate 与每题目平均提交次数 question_per_cnt。按照用户名升序排序。

result_info '是否通过,1:通过; 0:不通过',查询返回结果名称和顺序为

user_id|question_pass_rate|pass_rate|question_per_cnt

表的创建及数据添加:

sql 复制代码
drop table if exists done_questions_record;
create table done_questions_record
(
    user_id       int         not null,
    question_id   int         not null,
    question_type varchar(24) not null,
    done_time     datetime    not null,
    result_info   int         not null
);

insert into done_questions_record
values (101, 1, 'python', '2022-01-01 12:30:21', 0);
insert into done_questions_record
values (101, 1, 'python', '2022-01-01 12:30:22', 1);
insert into done_questions_record
values (102, 1, 'python', '2022-01-01 14:30:23', 1);
insert into done_questions_record
values (101, 2, 'sql', '2022-01-01 16:30:24', 1);
insert into done_questions_record
values (102, 2, 'sql', '2022-01-02 08:30:25', 1);
insert into done_questions_record
values (103, 1, 'python', '2022-01-03 10:30:26', 0);
insert into done_questions_record
values (104, 1, 'python', '2022-01-03 11:30:27', 0);
insert into done_questions_record
values (103, 2, 'sql', '2022-01-03 19:30:28', 1);
insert into done_questions_record
values (105, 1, 'python', '2022-01-03 12:30:29', 0);
insert into done_questions_record
values (103, 3, 'java', '2022-01-03 12:30:30', 0);
insert into done_questions_record
values (105, 3, 'java', '2022-01-03 12:30:31', 1);
insert into done_questions_record
values (105, 4, 'js', '2022-01-03 12:30:32', 0);
insert into done_questions_record
values (104, 5, 'c++', '2022-01-03 12:30:33', 1);
insert into done_questions_record
values (106, 5, 'c++', '2022-01-03 12:30:34', 0);
insert into done_questions_record
values (101, 5, 'c++', '2022-01-03 12:30:35', 1);
insert into done_questions_record
values (106, 5, 'c++', '2022-01-03 12:30:36', 1);
insert into done_questions_record
values (102, 5, 'c++', '2022-01-03 12:30:37', 1);
insert into done_questions_record
values (103, 4, 'js', '2022-01-03 12:30:38', 1);
insert into done_questions_record
values (105, 3, 'java', '2022-01-03 12:30:39', 1);
insert into done_questions_record
values (103, 2, 'sql', '2022-01-03 12:30:40', 0);
insert into done_questions_record
values (105, 1, 'python', '2022-01-03 12:30:41', 0);
insert into done_questions_record
values (105, 1, 'python', '2022-01-03 12:30:42', 1);
insert into done_questions_record
values (104, 2, 'sql', '2022-01-03 12:30:43', 1);

解题思路(题目理解可能会有差异,仅个人理解):

question_pass_rate : 通过的题目种类数个数 / 总题目种类个数 --去重

pass_rate:用户做题通过的个数 / 用户做题总个数

question_per_cnt:用户做题总个数 / 用户做过的题目种类 --去重

1、通过的题目种类数个数 --去重:

sql 复制代码
count(distinct iif(result_info = 1, question_id, null)

说明:此处不能用SUM函数,在去重时只会去重题目id,不会去重结果,用SUM函数会存在重复计算结果,且SUM函数用法比较局限,此题不推荐使用,本人懒,偷巧就用啦。

2、总题目种类个数 --去重:

sql 复制代码
count(distinct question_id)

3、用户做题通过的个数

sql 复制代码
sum(result_info)
--or
count(iif(result_info = 1, question_id, null)

说明:应为结果只有1、0且不存在去重问题,可直接相加,结果就是通过的个数,不推荐使用SUM函数,可使用or下面查询,当结果不为1、0时也可查询任何符合条件的总数。

4、用户做题总个数 = 用户的记录数:

sql 复制代码
count(user_id)

5、 用户做过的题目种类 --去重:

sql 复制代码
count(distinct question_id)

6、CONVERT函数

sql 复制代码
Convert(decimal(18,2),count(user_id)* 1.0 / count(distinct question_id)

说明:整数除法运算,结果将被截断为整数部分(0.75 = 0;1.75 = 1),如果要将结果转换为其他数据类型(如小数),可以使用CONVERT函数。使用CONVERT函数将整数除法结果转换为DECIMAL(18, 2)数据类型,该数据类型表示18位精度和2位小数。通过使用CONVERT函数,可以将整数除法结果转换为所需的数据类型,并保留适当的精度和小数位数。

注意:

① 1-5中所有函数都是在以user_id分组条件下实现的;

② sql sever中使用除法需要使用对应类型转换函数。

整理上述代码,可得查询:

查询如下:

sql 复制代码
select *
from (
 select  user_id,
 		--count(DISTINCT question_id) as 题数,
  		Convert(decimal(18,2),count(distinct iif(result_info = 1, question_id, null)) * 1.0 /count(distinct question_id)) as question_pass_rate,
 		--cast( sum(result_info) * 1.0 /count(DISTINCT question_id) as decimal(18,4) ) question_pass_rate2
		Convert(decimal(18,2),sum(result_info) * 1.0 /count( question_id)) as pass_rate,
		Convert(decimal(18,2),count(user_id)* 1.0 / count(distinct question_id)) as question_per_cnt
 from done_questions_record
 group by user_id
 ) t
 where question_pass_rate>0.6
相关推荐
TeYiToKu20 分钟前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws23 分钟前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
lzhlizihang26 分钟前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
威哥爱编程2 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
cuisidong19972 小时前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
乌恩大侠2 小时前
5G周边知识笔记
笔记·5g
Mephisto.java2 小时前
【大数据学习 | kafka高级部分】kafka的kraft集群
大数据·sql·oracle·kafka·json·hbase
Mephisto.java2 小时前
【大数据学习 | kafka高级部分】kafka的文件存储原理
大数据·sql·oracle·kafka·json
咔叽布吉3 小时前
【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection
论文阅读·笔记·目标检测
johnny2333 小时前
《大模型应用开发极简入门》笔记
笔记·chatgpt