分享好友 最新动态首页 最新动态分类 切换频道
mysql sql排序函数_MySQL实现SQL Server排名函数
2024-12-30 03:59

最近在MySQL中遇到分组排序查询时,突然发现MySQL中没有row_number() over(partition by colname)这样的分组排序。

并且由于MySQL中没有类似于SQL Server中的row_number()、rank()、dense_rank()等排名函数,所有找到以下实现方法,在此简单记录一下。

首先创建一个表并插入测试数据。

create table demo.Student (

ID int(11) NOT NULL AUTO_INCREMENT,

StuNo varchar(32) NOT NULL,

StuName varchar(10) NOT NULL,

StuAge int(11) DEFAULT NULL,

PRIMARY KEY (ID)

)

engine=innodb auto_increment=1 default charset=utf8 collate=utf8_general_ci;

insert into demo.Student(StuNo,StuName,StuAge) values('A001','小明',22);

insert into demo.Student(StuNo,StuName,StuAge) values('A005','小李',23);

insert into demo.Student(StuNo,StuName,StuAge) values('A007','小红',24);

insert into demo.Student(StuNo,StuName,StuAge) values('A003','小明',22);

insert into demo.Student(StuNo,StuName,StuAge) values('A002','小李',23);

insert into demo.Student(StuNo,StuName,StuAge) values('A004','小红',24);

insert into demo.Student(StuNo,StuName,StuAge) values('A006','小王',25);

select * from demo.Student;

测试数据如下

实现row_number()排名函数,按学号(StuNo)排序。

-- @row_number:=0,设置变量@row_number的初始值为0。

-- @row_number:=@row_number+1,累加@row_number的值。

select ID,StuNo,StuName,StuAge,@row_number:=@row_number+1 as row_number

from demo.Student a,

(

select @row_number:=0

) b

order by StuNo asc;

结果如下

实现rank()排名函数,按学生年龄(StuAge)排序。

-- @StuAge:=null,设置变量@StuAge的初始值为null

-- @rank:=0,设置变量@rank的初始值为0

-- @inRank:=1,设置变量@inRank的初始值为1

-- if(@StuAge=StuAge,@rank,@rank:=@inRank),指定排序列的值不变时@rank的值不变;指定排序列的值变化时@rank的值跳变为@inRank内部计数的值

-- @inRank:=@inRank+1,每一行自增1,用于实现内部计数

select t.ID,t.StuNo,t.StuName,t.StuAge,t.row_rank

from

(

select ID,StuNo,StuName,StuAge,if(@StuAge=StuAge,@rank,@rank:=@inRank) as row_rank,@inRank:=@inRank+1,@StuAge:=StuAge

from demo.Student a,

(

select @StuAge:=null,@rank:=0,@inRank:=1

) b

order by StuAge asc

) t;

结果如下

实现dense_rank()排名函数,按学生年龄(StuAge)排序。

-- @StuAge:=null,设置变量@StuAge的初始值为null

-- @rank:=0,设置变量@rank的初始值为0

-- if(@StuAge=StuAge,@rank,@rank:=@rank+1),指定排序列的值不变时@rank的值不变;指定排序列的值变化时@rank的值自增1

select t.ID,t.StuNo,t.StuName,t.StuAge,t.row_rank

from

(

select ID,StuNo,StuName,StuAge,if(@StuAge=StuAge,@rank,@rank:=@rank+1) as row_rank,@StuAge:=StuAge

from demo.Student a,

(

select @StuAge:=null,@rank:=0

) b

order by StuAge asc

) t;

结果如下

实现row_number() over(partition by colname order by colname)分组排名函数,按学生年龄(StuAge)分组排序。

-- @StuAge:=null,设置变量@StuAge的初始值为null

-- @row_number:=0,设置变量@row_number的初始值为0

-- if(@StuAge=StuAge,@row_number:=@row_number+1,@row_number:=1),指定排序列的值不变时@row_number的值自增1;指定排序列的值变化时@row_number的值等于1

select t.ID,t.StuNo,t.StuName,t.StuAge,t.row_number

from

(

select ID,StuNo,StuName,StuAge,if(@StuAge=StuAge,@row_number:=@row_number+1,@row_number:=1) as row_number,@StuAge:=StuAge

from demo.Student a,

(

select @StuAge:=null,@row_number:=0

) b

order by StuAge asc

) t;

结果如下

实现分组聚合字符串,即把指定列的值拼成字符串。

在SQL Server中时利用了中间变量实现,现在在MySQL中就比较简单了。

MySQL提供了一个group_concat()函数,可以把指定列的值拼成一个字符串,并可以按指定排序方式拼成字符,之间用逗号隔开。如下示例

select group_concat(StuNo order by StuNo asc) as column1,group_concat(StuNo order by ID asc) as column2

from demo.Student

结果如下

select StuName,group_concat(StuNo order by StuNo asc) as column1,concat('"',group_concat(StuNo order by StuNo asc),'"') as column2

from demo.Student

group by StuName

order by StuAge

结果如下

最新文章
DevEco Studio可视化界面开发教程
为了帮助刚入行的小白快速上手使用DevEco Studio进行可视化界面开发,以下是整体的流程:创建新项目设计界面布局添加控件元素设置控件属性和事件编写逻辑代码运行和调试下面将逐一介绍每个步骤需要做的事情以及相关的代码。首先,我们需要
2025最佳页面设计软件推荐,专业设计师常用的都在这里了
更新时间:2024-10-23 15:28:34今天这期不容错过,专业设计师们常用的 7 款软件都会在这期进行呈现,分别是即时设计、、Affinity Designer、Gravit Designer、Marvel、Bootstrap 与 Squarespace。对于专业设计师而言,选择适合自己的页面设
B站直播的极速排障建设
一、概述直播业务具有实时性强,复杂度高,排查链路长,影响面大等特征,线上问题如果不能立刻排查处理,分分秒秒都在影响用户的观看体验、主播的收入。但各端的问题可能都只是表象,例如,一个看似简单的画面卡顿问题,可能涉及到编码器配
Google 给我们展示了下一代搜索引擎的样子
作为一家靠搜索引擎发展起来的科技巨头,Google 在今年的开发者大会上给我们展示了下一代搜索引擎。1996 年 8 月,拉里·佩奇和谢尔盖·布林在斯坦福大学的网络上发布了一个名为 BackRub 的搜索引擎,后来这个搜索引擎改名为「Google」。到
C++实现DDos攻击测试
//for basic C funtions#includelt;stdio.hgt;//for string operations#includelt;stringgt;//only for cin and cout#includelt;iostreamgt;//for the socket programming in cpp#includelt;winsock2.hgt;//linking to ws2_32 library#prag
GCDF全球职业规划师认证:解锁职业发展新境界
在瞬息万变的职场江湖,如何规划自己的职业生涯成为许多人关注的焦点。全球职业规划师认证(GCDF)应运而生,为广大职场人士提供了一把解锁职业发展新境界的钥匙。本文北森生涯将深入剖析GCDF的内涵、价值及发展前景,助你把握全球职业规划
AI 绘画碰上经典古诗词,当真是笑不活了
用 AI 给“中文难度 10 级”的古诗词、文言文配插图,会是什么 Style?B站百万网友会告诉你:堪比“灵魂出窍”,直接绷不住了。具体啥情况?请各位观众老爷来看 VCR。现在展示的是李白《将进酒》名场面,这下可是真・300 杯:△网友:连羊
docker 中文官网 docker wiki
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Dcoker 是基
boss直聘苹果手机ios版
boss直聘ios版是苹果手机客户端版本,boss直聘专注于求职招聘,很多人都在用的找工作软件,超丰富的全面的职业岗位信息,公司企业在线查询,信息真实,让求职更高效,感兴趣的小伙伴不要错过哦!BOSS直聘专注互联网招聘求职找工作APP,求职
DBY DCY 250450500 三级圆柱齿轮减速机配5马力电机
ZQ JZQ软齿表面减速器ZSY / ZLY / ZDY圆柱齿轮减速机,齿轮渗碳,淬火,研磨,高承载能力,低噪音;主要用于皮带输送机和各种运输机械,也可用于驾驶其他一般机械。优点是:输入轴和输出轴在驱动装置中垂直布置,轴承容量强,使用寿命长,体
相关文章
推荐文章
发表评论
0评