为企业设计网站,多人一起做视频网站,购物网站开发视频教程,微信app定制开发----查询每天刷题通过数最多的前二名用户id和刷题数 现有牛客刷题表questions_pass_record#xff0c;请查询每天刷题通过数最多的前二名用户id和刷题数#xff0c;输出按照日期升序排序#xff0c;查询返回结果名称和顺序为#xff1a; date|user_id|pass_count
表单创建…----查询每天刷题通过数最多的前二名用户id和刷题数 现有牛客刷题表questions_pass_record请查询每天刷题通过数最多的前二名用户id和刷题数输出按照日期升序排序查询返回结果名称和顺序为 date|user_id|pass_count
表单创建和数据的插入
drop table if exists questions_pass_record;
CREATE TABLE questions_pass_record
(user_id int NOT NULL,question_type varchar(32) NOT NULL,device varchar(14) NOT NULL,pass_count int NOT NULL,date date NOT NULL
);
INSERT INTO questions_pass_record
VALUES (101, java, app, 2, 2020-03-01);
INSERT INTO questions_pass_record
VALUES (102, sql, pc, 15, 2020-03-01);
INSERT INTO questions_pass_record
VALUES (102, python, pc, 9, 2021-04-09);
INSERT INTO questions_pass_record
VALUES (202, python, pc, 11, 2021-04-09);
INSERT INTO questions_pass_record
VALUES (104, python, app, 3, 2021-04-09);
INSERT INTO questions_pass_record
VALUES (105, sql, pc, 60, 2018-08-15);
INSERT INTO questions_pass_record
VALUES (104, sql, pc, 20, 2018-08-15);
INSERT INTO questions_pass_record
VALUES (304, sql, pc, 10, 2018-08-15);查询语句 select user_id,pass_countfrom (select date,user_id,pass_count,dense_rank( )over(PARTITION BY user_id ORDER BY date ) as rank_numfrom questions_pass_recordgroup by date,user_id,pass_count) twhere rank_num in (1,2)在查询中 DENSE_RANK( ) 函数用于在每个分组内按照指定的排序方式为行分配一个排名值排名值可以重复并且不存在断开的排名。通过使用 DENSE_RANK( ) 函数可以方便地为每个分组内的行分配排名值用于处理需要对数据进行排名和分组的情况。
语法
DENSE_RANK() OVER (PARTITION BY column1 ORDER BY column2)PARTITION BY 指定了分组的列ORDER BY 指定了排序的列。
dense_rank( )over(PARTITION BY user_id ORDER BY date ) as rank_num使用 DENSE_RANK( ) 函数为每个分组内的行分配一个排名值分组依据是 user_id 列排序依据是 date 列将排名值命名为 rank_num。
需要注意 ① RANK( )、DENSE_RANK( ) 和 ROW_NUMBER( ) 函数是用于计算和分配行排序值的窗口函数。它们在使用 OVER 子句时可以根据指定的排序规则为结果集中的行分配排名、稠密排名或行号。 ② RANK( ) 函数 RANK( ) 函数为结果集中的行分配排名值并且具有相同值的行将具有相同的排名值随后的排名值将会跳过相同的排名并递增。
示例查询学生成绩排名
select *,rank() over (order by Score desc) as rank_over
from Stu_Scores执行结果
③ DENSE_RANK( ) 函数 DENSE_RANK( ) 函数为结果集中的行分配稠密排名值具有相同值的行将具有相同的排名值但排名值不会跳过。 示例查询学生成绩排名
select *,dense_rank() over (order by Score desc) as dense_rank_over
from Stu_Scores执行结果
④ ROW_NUMBER( ) 函数 ROW_NUMBER( ) 函数为结果集中的行分配唯一的行号每行的行号都是唯一的。 示例查询学生成绩排名
select *,row_number() over (order by Score desc) as row_number_over
from Stu_Scores执行结果 可根据实际需求选择需要使用的函数。