【新星计划回顾】第三篇学习计划-分页和排名函数的运用

news2025/1/13 10:24:45

🏆🏆今天是【全国科技者工作日】,在这个特别的日子里,自然要写篇文章!
最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点。
🏆🏆非常感谢大家的支持和活动期间的文章输出,导师也是忙里抽空给大家准备分享的内容,也是尽力了,所以分享的知识点主要是偏向于基础和基本的实战,虽然不是讲解的很系统,但是能够了解到一定的实战信息
🏆🏆期待我们的下次学习,导师将会在6月或者7月再次发起新星计划,本次活动也得到学员和平台的肯定,平台也是非常欢迎导师再次发起新星计划,非常感谢!

目录

  • 1、创建表
    • 1.1、模拟生成30万学生记录
  • 2、知识点
    • 2.1、重新排序函数
    • 2.2、分页查询
    • 2.3、排名函数

  • 原计划
    在这里插入图片描述
  • 变更计划
    在这里插入图片描述
    有时候计划赶不上变化,原本想在第二周对索引知识点进行实战,但遇到模拟数据量不够且在数据库批量生成会比较慢,索引查询效果也不明显,所以变更了计划!

1、创建表

1.1、模拟生成30万学生记录

1)大家根据上面提供的sql语句,模拟生成30万名学生记录
记录总数:6个年纪30万名学生3科=5400000,540万条记录
2)添加数据大概耗时
在这里插入图片描述

  • 代码
declare @classCount int
set @classCount=1
declare @className nvarchar(50)
declare @courseName nvarchar(50)
declare @scoreValue int
declare @studentCount int
set @studentCount=80

-- 定义一个姓氏表变量,表添加两个字段,自增编号和名字
declare @surnameTable table(
    id int identity(1,1) primary key, 
    name nvarchar(10)
)

-- 定义一个名字表变量,表添加两个字段,自增编号和名字
declare @nameTable table(
    id int identity(1,1) primary key, 
    name nvarchar(10)
)

-- 姓和名字
-- 姓氏
insert @surnameTable values
('王'),('李'),('张'),('刘'),('陈'),('杨'),('黄'),('赵'),('周'),('吴'),
('徐'),('孙'),('马'),('胡'),('朱'),('郭'),('何'),('罗'),('高'),('林') 
-- 名称
insert @nameTable values
('芸'),('荷'),('星'),('秋'),('嘉'),('娜'),('珊'),('菲'),('素'),('嫣'),
('慧'),('慕'),('歆'),('巧'),('绮'),('羽'),('静'),('柔'),('采'),('沐'),
('苑'),('姣'),('芳'),('宁'),('沛'),('玥'),('文'),('如'),('悦'),('若'),
('德'),('蕾'),('颜'),('依'),('盼'),('菀'),('秀'),('草'),('莺'),('倩'),
('柳'),('娴'),('彨'),('舒'),('雅'),('淑'),('冉'),('云'),('凝'),('棋')

-- 循环遍历班级
declare @num int
set @num=0
while @classCount<=6 begin
    set @studentCount=300000
    -- ===年级信息===
    set @className=convert(varchar(10),@classCount)+'年级'
    set @classCount+=1
    -- ===/年级信息===

    -- ===遍历创建学生记录===
    while @studentCount>0 begin
        set @num+=1
        -- 生成名字
        declare @name nvarchar(50)
        declare @nameLength int
        set @nameLength=1+round(rand()*1,0)
        set @name=(select name from @surnameTable where id=round(rand()*20,0))
        while(@nameLength>0) begin
            set @name+=(select name from @nameTable where id=round(rand()*50,0))
            set @nameLength-=1
        end
        set @name+=convert(nvarchar(10),@num)
        if @name=null begin
            set @name='张三'+convert(nvarchar(10),@num)
        end

        -- ===年级课程===
        -- 语文
        set @courseName='语文'
        set @scoreValue=round(rand()*50+50,0)
        insert into student_score_30wan(studentName,className,courseName,scoreValue,createTime)
        values(@name,@className,@courseName,@scoreValue,getdate())

        -- 数学
        set @courseName='数学'
        set @scoreValue=round(rand()*50+50,0)
        insert into student_score_30wan(studentName,className,courseName,scoreValue,createTime)
        values(@name,@className,@courseName,@scoreValue,getdate())

        -- 英语
        set @courseName='英语'
        set @scoreValue=round(rand()*50+50,0)
        insert into student_score_30wan(studentName,className,courseName,scoreValue,createTime)
        values(@name,@className,@courseName,@scoreValue,getdate())
        -- ===/年级课程===
        set @studentCount-=1
    end

end


--select * from student_score_10wan
--truncate table student_score
--truncate table student_score_10wan

🏆🏆 原则:Write Less Do More!
🍎🍎简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑!

2、知识点

2.1、重新排序函数

1)row_number()
此函数是对查询结果集进行排序重新编号
一般都会配合over()函数进行使用

2)over()
必填参数:一般会有一个order by + 排序字段
选填参数:partition by + 需要分组的字段(可以是单个也可以是多个组合)

3)查询按年级和班级进行分组以及成绩降序排序前20名学生
关键sql语句:row_number() over(partition by className,courseName order by scoreValue desc)

  • 简单解释就是:
    partion by className,courseName:按班级和课程分组
    rder by scoreValue desc:然后在班级和课程分组里再按成绩降序排序
    row_number:根据上面分组和排序,重新生成从1开始按顺序排序,1、2、3…

  • 表别名或字段别名
    顺便提一下,在表明或者字段名后面跟着 as + 别名,也可以直接省略as,直接就是空格+别名
    比如:
    在这里插入图片描述

  • 代码如下

select 
row_number() over(partition by className,courseName order by scoreValue desc) as rowid,
a.*
from student_score_30wan as a
  • 上面语句查询540万条记录,重新分组排序耗时差不多2分钟
    在这里插入图片描述

2.2、分页查询

1)从下图可知,不可能每次都是查询出540万条记录
一般在系统里,都是按10条一页、20条一页的方式查询

2)查询需要1到20的记录

select b.* from(
    select 
    row_number() over(partition by className,courseName order by scoreValue desc) as rowid,
    a.*
    from student_score_30wan as a
) b
where b.rowid>=1 and b.rowid<=20

3)动态分页查询语句

-- 定义一个变量,就是当前页
declare @pageIndex int
set @pageIndex=1000

-- 定义一个变量,就是一页20条记录
declare @pageSize int
set @pageSize=20

--通过改变当前页的值来实现分页查询

select b.* from(
    select 
    row_number() over(partition by className,courseName order by scoreValue desc) as rowid,
    a.*
    from student_score_30wan as a
) b
where b.rowid>=(@pageIndex-1)*@pageSize and b.rowid<=@pageIndex*@pageSize

2.3、排名函数

1)rank()
排名函数,同样是对查询数据集进行序号重新编号,唯一不同的是,如果值相同,那么会有一个名次并列,就是名次相同的情况

2)partition by
分组关键词
比如:partition by className,courseName,按班级和课程排名,意思就是一年级语文成绩排名、二年级数学成绩排名等

3)排名查询

  • 代码
select b.* from(
    select 
    rank() over(partition by className,courseName order by scoreValue desc) as rankid,
    a.*
    from student_score_20wan as a
) b
where b.rankid>=10 and b.rankid<=20
  • 效果
    在这里插入图片描述

🍎🍎 本篇到此结束,感谢阅读的小伙伴,打个小小的ad,欢迎关注导师的公众号【有趣小馆】,导师会时不时发布一些有趣好玩的功能,欢迎关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战一个react(0-1)项目

文章目录 1. 安装2. 完成一个组件开发3. 添加路由3. 引入element-react1. 运行发现报错./node_modules/element-react/dist/npm/es5/src/locale/format.js2. 接着又报错The <Router /> component appears to be a function component that returns a class instance. Cha…

ABP VNext认证授权获取Token

ABP VNext认证授权获取Token 1.Password授权方式获取1.1 请求说明1.2 请求示例1.3 请求参数 2.authorization_code模式获取2.1 无认证授权&#xff0c;跳转至授权认证中心2.2 用户密码登录2.3 登录成功&#xff0c;服务器会跳转至redirect_url所指地址 1.Password授权方式获取 …

vue-kindeditor 安装和解决问题

效果图 kindeditor 引入 一、去官网下载 kindeditor 包 官方链接 二、在vue里的static文件夹下 创建一个 文件夹名字叫 kindeditor&#xff0c; 把下载好的文件放在这里 三、在 公共组件 components 下 创建kindeditor.vue 文件 <template><div class"kindedit…

拿到字节跳动奖学金,入职字节跳动做科研,他们经历了什么?

前不久&#xff0c;第三届字节跳动奖学金计划已经正式启动。 自 2021 年起&#xff0c;字节跳动奖学金计划已经完成了两届评选&#xff0c;共有 19 位优秀学子荣获每人 10 万元人民币的奖学金。 在奖学金支持下&#xff0c;他们获得了新的科研项目费用、学术交流机会&#xff0…

高压放大器在驱动压电陶瓷进行铝板无损检测中的应用研究

想要达成在不损害或不影响被测对象使用性能及自身性质的前提下&#xff0c;对被测对象内部进行缺陷&#xff0c;结构&#xff0c;失效分析&#xff0c;就得用到无损检测&#xff08;Non Destructive Testing&#xff09;技术&#xff0c;最常用的无损检测方法有很多&#xff0c…

【网络安全知识】网络技术领域术语大全,强烈建议收藏!

自主访问控(DAC:Discretionary Access Control) 自主访问控制(DAC)是一个访问控制服务&#xff0c;其执行一个基于系统实体身份的安全政策和它们的授权来访问系统资源。 双附接集线器(DAC: Dual-attached Concentrator) 双附接集线器(DAC)是FDDI或CDDI集线器有能力接入到一个…

RK3568 AP6275S蓝牙驱动程序调度过程

1、前言 今年3月份调度了RK3568驱动程序&#xff0c;当时由于时间的问题&#xff0c;AP6275S蓝牙驱动程序没有调试成功。当时仔细检查的设备树的配置。 wireless_bluetooth: wireless-bluetooth {compatible "bluetooth-platdata";clocks <&rk809 1>;cl…

离散数学_十章-图 ( 4 ):图的表示和图的同构

&#x1f4f7;10.4 图的表示和图的同构 1. 图的表示1.1 邻接表1.1.1 简单图的邻接表1.1.2 有向图的邻接表 1.2 邻接矩阵❗在邻接表和邻接矩阵之间取舍1.3 关联矩阵 2. 图同构3. ⚡判断两个简单图是否同构 图的表示方式有很多种&#xff0c;选择最方便的表示有助于对图的处理~ …

Navicat 面向 PostgreSQL 查询超时的工具解决方案

文章目录 Navicat 面向 PostgreSQL 查询超时的工具解决方案查询超时的必要性应用场景 查询分析器 | Navicat Monitor在数据库级别设置为特定用户设置查询超时 结语 Navicat 面向 PostgreSQL 查询超时的工具解决方案 早前&#xff0c;我们发表过一篇《PostgreSQL 与 Navicat &am…

Datax ftp写入hive

这是一个巨大的坑&#xff0c;网上对这块的完整描述真的很少&#xff0c;新手真的会很迷茫&#xff01;&#xff01;&#xff01; 插件 选择插件 reader插件选择&#xff1a;ftpread write插件选择&#xff1a;hdfswrite 参数配置 reader参数 "parameter": {/…

干货|SpringCloud全家桶微服务初探

SpringCloud的从整体架构上看&#xff0c;相对来说是完整的、庞大的。它不仅仅是一个基础性架构工具&#xff0c;它为微服务架构提供了一个“全家桶”的套餐。每一个模块关注各自的职能&#xff0c;并且能够很好地配合与协作&#xff0c;能够帮助入门者快速搭建起一套微服务架构…

前后端联调跨域问题

文章目录 什么是同源策略如何判断是否同源&#xff1f;跨域资源共享(CORS)如何解决跨域问题 什么是同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。 如何判断是否同源&#xff1f; 如果…

从中国人民大学与加拿大女王大学金融硕士的学员构成,了解金融行业都有哪些职位

金融行业最受欢迎的岗位莫过于券商、银行、基金公司、私募市场、体制内&#xff08;监管部门、交易所等&#xff09;、信托、大企业投资部、保险、管理咨询、资产管理。在当下如果要选择工作&#xff0c;想找就业率第一、薪酬排名第一的行业&#xff0c;那一定是金融工作。中国…

03 redis新类型bitmap/hyperloglgo/GEO

亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果&#xff0c;就是前面讲解过的交差并等集合统计交并差集和聚合函数的应用 排序统计 抖音视频最新评论留言的场景&#xff0c;请你设计一个展现列表。考察你的数据结构和设计思路设计案例和回答思路以抖音vcr最…

3.java高级之GUI编程

1.gui (graphical user interface) awt sun公司最早的gui,不美观,不兼容各平台swing : awt升级2.顶层容器(只有一个)(其他的只能放这里)Jframe Jdialog对话框 Jwindow(x) //在main方法写fnew Jframe(); f.setSize(300,300); //设置大小f.setTitle("hello"); //设置…

java条件语句

文章目录 一、java条件语句1、Java 条件语句 - if...else2、Java switch case 语句 总结 一、java条件语句 1、Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法…

你真的了解kotlin中协程的suspendCoroutine原理吗?

文章目录 什么是协程suspendCoroutineUninterceptedOrReturnsuspendCoroutineUninterceptedOrReturn存在的问题suspendCoroutinesuspendCancellableCoroutine ​ 引言&#xff1a; 在Kotlin协程中&#xff0c;如何让一个suspned 函数挂起&#xff1f;如何让挂起协程恢复&#…

STM32G4 比较器COMPx(寄存器开发)

目录 1. 特性1.1 框图1.2 比较器输入信号SEL1.3 比较器滞回选择HYST1.4 比较器的输出1.5 LOCK机制 2. 编程2.1 初始化步骤2.2 举例 STM内部的比较器是模拟量的比较器&#xff0c;其与APB2时钟同步&#xff0c;在RCC时钟控制器中没有COMx时钟使能标志位&#xff0c;其时钟的使能…

前端自学要多久?自学前端一般多久可以找到差不多的工作?

好程序员今天给各位同学分享自学前端的高效率路径&#xff0c;最快4个月&#xff0c;平均6个月&#xff01; 一、html, CSS (1月) 1.基本语法, 2.做2-3个项目实战 3.刷面试题 二、JavaScript (1.5月) 1.基本语法 2.实际案例练习融合HTML, Css项目实战 3.刷题面试题 三、Vue/Rea…

Java 高级应用-多线程-(三)实现 Callable 接口与使用线程池创建线程

实现 Callable 接口 • 与使用 Runnable 相比&#xff0c; Callable 功能更强大些 – 相比 run()方法&#xff0c;可以有返回值 – 方法可以抛出异常 – 支持泛型的返回值&#xff08;需要借助 FutureTask 类&#xff0c;获取返回结果&#xff09; • Future 接口&#xff08;…