做题笔记:SQL Sever 方式做牛客SQL的题目--查询每天刷题通过数最多的前二名用户

----查询每天刷题通过数最多的前二名用户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_count
 from (
		 select date,user_id,pass_count,
				dense_rank( )over(PARTITION BY user_id ORDER BY date ) as rank_num
		 from questions_pass_record
		 group by date,user_id,pass_count
		) t
 where 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

执行结果:
在这里插入图片描述
可根据实际需求选择需要使用的函数。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-13 02:02:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-13 02:02:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-13 02:02:02       82 阅读
  4. Python语言-面向对象

    2023-12-13 02:02:02       91 阅读

热门阅读

  1. VUE ui工程创建

    2023-12-13 02:02:02       60 阅读
  2. 常见加密算法解密脚本

    2023-12-13 02:02:02       68 阅读
  3. 前端知识笔记(三十六)———HTTP 缓存机制

    2023-12-13 02:02:02       53 阅读
  4. 【代码随想录】算法训练计划49

    2023-12-13 02:02:02       67 阅读
  5. MySQL中查询当天数据中离时间点最近的数据

    2023-12-13 02:02:02       67 阅读
  6. Python卡尔曼滤波器OpenCV跟踪和预测物体的轨迹

    2023-12-13 02:02:02       60 阅读
  7. 3D点云:平面模型上提取凸(凹)多边形方法

    2023-12-13 02:02:02       49 阅读
  8. Codeforces Round 777 (Div. 2) (C D分类讨论 E倍增+贪心)

    2023-12-13 02:02:02       54 阅读
  9. 人工智能应用专栏----专栏介绍

    2023-12-13 02:02:02       57 阅读
  10. vue递归以及示例

    2023-12-13 02:02:02       54 阅读
  11. 第30期 | GPTSecurity周报

    2023-12-13 02:02:02       52 阅读
  12. 力扣labuladong——一刷day66

    2023-12-13 02:02:02       51 阅读
  13. SpringBoot 面试题和答案,最新面经

    2023-12-13 02:02:02       53 阅读
  14. 不容错过的计算机网络知识点解密!

    2023-12-13 02:02:02       48 阅读