最近在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:=StuAgefrom 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 

结果如下:

转载于:https://www.cnblogs.com/asdyzh/p/9818761.html

MySQL实现SQL Server排名函数相关推荐

  1. SQL SERVER 排名 函数

     SQL SERVER 排名 函数 ROW_NUMBER():行号.SQL Server2005中,使用ROW_NUMBER()非常方便 SELECT  * , ROW_NUMBER() OVER ( ...

  2. mysql coalesce函数用法,SQL Server COALESCE函数详解及实例

    SQL Server COALESCE函数详解 很多人知道ISNULL函数,但是很少人知道Coalesce函数,人们会无意中使用到Coalesce函数,并且发现它比ISNULL更加强大,其实到目前为止 ...

  3. mysql的datepart函数,SQL Server Datepart()函数

    在本教程中,将学习如何使用SQL Server DATEPART()函数来提取日期的一部分. SQL Server DATEPART()函数简介 DATEPART()函数返回一个整数,它是日期的一部分 ...

  4. mysql标量函数,SQL Server标量函数

    在本教程中,将了解SQL Server标量函数以及如何使用它们来封装公式或业务逻辑,并在查询中重用它们. 标量函数是什么 SQL Server标量函数接受一个或多个参数并返回单个值. 标量函数可帮助简 ...

  5. SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    Sql 四大排名函数(ROW_NUMBER.RANK.DENSE_RANK.NTILE)简介 排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Ord ...

  6. SQL Server CONVERT() 函数,Date 函数

    From: http://www.w3school.com.cn/sql/func_convert.asp 定义和用法 CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() ...

  7. 将Id相同的字段合并,并且以逗号隔开 (mysql、sql server)

    前言 作者目前是这么理解这个问题,如果有更好的想法,可在评论区留言.对于合并,要么是子连接(相对于一张表),又或者是多张表(可使用左连接或者右连接),当然这很常用.所以在使用前,必须先搞懂左右连接以及 ...

  8. mysql和sql server有什么区别?

    MySQL和SQL Server之间的区别: 1.开源 MySQL是一个开源关系数据库管理系统(RDBMS):而SQL Server不是开源的,是商业的. 2.开发语言不同 mysql:mysql能用 ...

  9. SQL Server用户自定义函数

    用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统 函 数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过 EXECUTE 命令来执行.在 SQL Server 中根据 ...

  10. mysql oracle mvcc_PostgreSQL、Oracle/MySQL和SQL Server的MVCC实现原理方式

    PostgreSQL.Oracle/MySQL和SQL Server的MVCC实现原理方式 关系数据库管理系统使用MVCC(Multiversion Concurrency Control多版本并发控 ...

最新文章

  1. strings 命令——ELF文件格式与“链接和装载”
  2. 13-19 Python Number、Python字符串、Python列表(List)、集合的基本操作、元组、字典Dicttionnary、日期和时间
  3. 纯数字加密和解密算法(原创)
  4. java string args_java – 语法“final String … args”是什么意思/做什么?
  5. DIV+CSS 入门
  6. Oracle OCM 认证指南
  7. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的微信小程序便利店购物系统
  8. 20200118:(leetcode)最长回文子串(中心扩展算法详解及思考)
  9. stata学习笔记(三):计算五年内的ROA标准差所用到的一些知识
  10. 13.xsi:schemaLocation详解
  11. Activity-GalleryView
  12. 数据库课设——DMS(高校宿舍管理系统)
  13. Centos7之Hadoop完全分布式集群搭建和配置
  14. iOS-[NSAttributedString]设置富文本和计算富文本高度
  15. 运维派网站数据迁移过程踩到的坑和教训
  16. 计算机英语缩略词大全,计算机英语缩略语大全
  17. 关于MySQL外键的设置
  18. IllegalArgumentException 异常
  19. oracle001658,ORACLE error 1658,该如何解决
  20. 聊聊不确定性和确定性------化不确定性为确定性

热门文章

  1. 《Master Bitcoin》学习笔记02——比特币的交易模型
  2. 古老的版本管理器---P4客户端配置流程,操作总结
  3. 汇编---3---物理地址
  4. httpd-2.4.18源码安装
  5. Hibernate常出现的报错
  6. centos最新版solr5.3.1安装和数据整理以及遇到的问题解答
  7. 二叉树的存储方式以及递归和非递归的三种遍历方式
  8. awl 多线程syn***
  9. Bean在Spring和SpringMVC中无所不在
  10. servlet执行流程代码分析