MySQL学习笔记:三种组内排序方法
由于MySQ没有提供像Oracle的dense_rank()或者row_number() over(partition by)等函数,来实现组内排序,想实现这个功能,还是得自己想想办法,最终通过创建行号实现。
方法一:
1.建立测试表
# 建表 DROP TABLE test; CREATE TABLE test (myNAME VARCHAR (10),name1 VARCHAR (10),count1 BIGINT );
2.删除原有数据
# 删除原有数据 DELETE FROM test; SELECT * FROM test;
3.插入数据
# 插入数据 INSERT INTO test VALUES('1','a',2); INSERT INTO test VALUES('1','b',1);; INSERT INTO test VALUES('1','c',4); INSERT INTO test VALUES('1','d',5); INSERT INTO test VALUES('1','e',7); INSERT INTO test VALUES('1','f',8); INSERT INTO test VALUES('2','g',9); INSERT INTO test VALUES('2','h',0); INSERT INTO test VALUES('2','i',21); INSERT INTO test VALUES('2','j',3); INSERT INTO test VALUES('2','k',4); INSERT INTO test VALUES('2','1',56); INSERT INTO test VALUES('3','m',67); INSERT INTO test VALUES('3','n',89); INSERT INTO test VALUES('3','o',12); INSERT INTO test VALUES('3','p',22); INSERT INTO test VALUES('3','q',23); INSERT INTO test VALUES('3','r',42); INSERT INTO test VALUES('3','s',26);
4.查询
# 查询 SELECT * FROM test;
5.构造行号rownum
#---- 构造rownum ---- SELECT b.myNAME, b.name1, b.count1,IF(@name = b.myNAME, @rank := @rank + 1, @rank := 1) -- 3.判断name是否等于此行的myNAMEAS rank, -- 如果是,则rank自增;如果不是,则初始化rank=1@name := b.myNAME FROM (SELECT myNAME, name1, count1 FROM test ORDER BY myNAME ASC, count1 DESC) b, -- 1.先进行子查询 排序 (SELECT @rownum := 0,@name := NULL, -- 2.初始化rownum=0,name=NULL, rank=0@rank := 0) a;
6.筛选组内前五(即行数小于等于5的行)
SELECT myNAME, name1, count1, rank FROM (SELECT b.myNAME, b.name1, b.count1,IF(@name = b.myNAME, @rank := @rank + 1, @rank := 1) -- 3.判断name是否等于此行的myNAMEAS rank, #-- 如果是,则rank自增;如果不是,则初始化rank=1@name := b.myNAME FROM (SELECT myNAME, name1, count1 FROM test ORDER BY myNAME ASC, count1 DESC) b, -- 1.先进行子查询 排序 (SELECT @rownum := 0,@name := NULL, -- 2.初始化rownum=0,name=NULL, rank=0@rank := 0) a) result WHERE rank <=5;
方法二:
1.关联
SELECT * FROM test a JOIN test b ON a.`myNAME` = b.`myNAME` AND a.`count1` <= b.`count1`;
2.排序
SELECT * FROM test a JOIN test b ON a.`myNAME` = b.`myNAME` AND a.`count1` <= b.`count1` ORDER BY a.`myNAME` ASC, a.`count1` DESC;
3.最终实现
SELECT a.myNAME,a.name1,a.count1,COUNT(*) AS rank FROM test a JOIN test b ON a.`myNAME` = b.`myNAME` AND a.`count1` <= b.`count1` GROUP BY a.`myNAME`,a.`name1`,a.`count1` ORDER BY a.`myNAME` ASC, a.`count1` DESC;
方法三:
其实方法三只是方法二的补充,针对有数据相等的情况。
SELECT a.myNAME, a.name1, a.count1, COUNT(1) AS rank FROM test AS a, test AS b WHERE a.myNAME = b.myNAME AND a.count1 < b.count1 OR (a.count1 = b.count1 AND a.myNAME <= b.myNAME) GROUP BY a.myNAME, a.name1, a.count1 ORDER BY a.myNAME ASC, rank ASC;
END 2018-05-2510:54:26
转载于:https://www.cnblogs.com/hider/p/9087374.html
MySQL学习笔记:三种组内排序方法相关推荐
- MySQL学习笔记(三)查询
写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...
- MYSQL学习笔记三:日期和时间函数
MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...
- mysql学习笔记三 —— 数据恢复与备份
要点: 1.存储引擎 2.导入导出 3.备份与恢复 查看当前数据库中的所有表 use db1: show tables: 1.存储引擎 不同的发动机(引擎)适用的汽车类型不一样. 存储和处理的不同方式 ...
- parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池
线程组 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织. 构造函数 ThreadGroup(String name)//默认parent为当前线程组 ThreadGro ...
- 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
一.Inline Method 概述 一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂. 动机(Motivation) 以简短的函数表现动作意图,这样会使 ...
- mysql的基本数据类型_mysql基本数据类型(mysql学习笔记三)
Mysql数据类型 小数: 浮点:小数位可以变化 Float单精度默认精度6位左右 Double双精度默认精度16位左右 支持,控制数值范围 Type(M,D) M表示所有数值位数(不包括小数点和符号 ...
- MySQL学习笔记(三)
准备好一个表的员工,接下来都是对这个表进行操作 一,数据表里内容的修改和删除(更改,删除) 1.1增加一列数据 格式:alter table 表名 add column 列名 数据类型(数据长度); ...
- ssm上传文件进度条_ssm学习笔记-三种文件上传方式
首先需要引入commons-fileupload commons-fileupload commons-fileupload 1.3.3 MultipartFile方式 示例代码: @RequestM ...
- MySQL学习笔记三: 1. 多表查询 2. 事务 3. DCL
## 多表查询: * 查询语法: select 列名列表 from 表名列表 where.... ...
最新文章
- 如何解决动态查询语句太长,大于数据库字符的最大长度
- Leetcode 769. Max Chunks To Make Sorted
- 全部编程皆为Web编程
- 前端技巧|Chrome上4款超级实用的插件!
- js(Dom+Bom)第二天(2)
- 坑了腾讯1624万!3人冒充老干妈员工诈骗腾讯 判决结果来了...
- 程序员选手机那些事儿
- char*和CString转换
- C#代码执行中等待10秒
- 从零开始使用webpack 4, Babel 7创建一个React项目
- JavaScript内置对象之Array对象总结(附实例)
- 保持头脑清醒的窍门2/13
- ic启动器怎么导入模组_Model Y和Model 3的模组拆解对比
- 磁盘分区 如何分出整数
- swf转html5批量转换,gif转swf转换工具,gif转swf格式转换器|批量转换
- 禅与摩托车维修艺术,又名万里任禅游
- 微擎添加绑定公众号,空白页或500错误,打不开
- 深度学习(17)—— 度量学习
- ios与android指纹识别,iOS开发实现TouchID指纹解锁
- 史上最详细的讲解,第一次如何上传本地代码到github
热门文章
- 通向财务自由之路08_入市或市场时机选择
- 读书笔记_打开量化投资的黑箱10
- vim python补全_转:VIM python 自动补全插件:pydiction
- mongodb空间查询java,java查看mongodb集合表空间大小
- python查看指令的方法python -h
- ecshop 后台添加评论_技术小白如何添加服务号模板消息?服务号的模板消息功能到底该怎么使用?...
- python web框架哪个好_盘点:9款流行Web框架及其优缺点
- C++递归以及内存值的传递
- GNN在谱域下的演化:Spectral CNN,ChebyNet,GCN
- 解线性方程组的迭代法(雅可比迭代法)