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('','a',2);
INSERT INTO test VALUES('','b',1);;
INSERT INTO test VALUES('','c',4);
INSERT INTO test VALUES('','d',5);
INSERT INTO test VALUES('','e',7);
INSERT INTO test VALUES('','f',8);
INSERT INTO test VALUES('','g',9);
INSERT INTO test VALUES('','h',0);
INSERT INTO test VALUES('','i',21);
INSERT INTO test VALUES('','j',3);
INSERT INTO test VALUES('','k',4);
INSERT INTO test VALUES('','',56);
INSERT INTO test VALUES('','m',67);
INSERT INTO test VALUES('','n',89);
INSERT INTO test VALUES('','o',12);
INSERT INTO test VALUES('','p',22);
INSERT INTO test VALUES('','q',23);
INSERT INTO test VALUES('','r',42);
INSERT INTO test VALUES('','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是否等于此行的myNAME
AS 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是否等于此行的myNAME
AS 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
MySQL学习笔记:三种组内排序方法的更多相关文章
- MySql学习笔记三
MySql学习笔记三 4.DML(数据操作语言) 插入:insert 修改:update 删除:delete 4.1.插入语句 语法: insert into 表名 (列名1,列名2,...) val ...
- MYSQL学习笔记三:日期和时间函数
MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...
- [ 原创 ]学习笔记-三种向ListView中填充简单文本的方法
Android 中ListView是很重要的一块内容 掌握ListView的基本用法 对学习安卓起着举足轻重的作用 今天就介绍一下三种向ListView 填充简单文本的方法 填充其他数据类型的用法之后 ...
- Spark学习笔记-三种属性配置详细说明【转】
相关资料:Spark属性配置 http://www.cnblogs.com/chengxin1982/p/4023111.html 本文出处:转载自过往记忆(http://www.iteblog.c ...
- mysql学习笔记三 —— 数据恢复与备份
要点: 1.存储引擎2.导入导出3.备份与恢复 查看当前数据库中的所有表use db1:show tables: 1.存储引擎 不同的发动机(引擎)适用的汽车类型不一样. 存储和处理的不同方式.不同的 ...
- MySQL学习笔记(三)—索引
一.概述 1.基本概念 在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经 ...
- mysql学习之-三种安装方式与版本介绍
MYSQL版本介绍 mysql分alpha,beta,rc,GA四个版本. alpha 暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性beta 以后的beta ...
- mysql学习笔记(三)
-- 主键冲突(duplicate key) ,'xujian','anhui'); ,'xiewei','anhui'); ,'luyang','anhui');-- 主键冲突了 -- 可以选择性的 ...
- MySQL学习笔记三:库和表的管理
1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...
随机推荐
- bzoj 2809
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4519 Solved: 2329[Submi ...
- codeforces.com/contest/251/problem/C
C. Number Transformation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- 「Vue」自定义按键修饰符
vue.config.keyCodes.f2 = 113 设置完成后就可以绑定f2的按键操作@keyup.f2="add" 自带的有enter esc delete 空格 上下左右 ...
- P2015 二叉苹果树
P2015 二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接 ...
- Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)
Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...
- MySQL搭建环境
一.MySQL安装 Windows下安装参考网址:https://blog.csdn.net/NepalTrip/article/details/79492058 Ubuntu Linux下安装参考网 ...
- ffmpeg的API函数用法 :sws_scale函数的用法-具体应用
移植ffmpeg过程中,遇到swscale的用法问题,所以查到这篇文章.文章虽然已经过去很长时间,但是还有颇多可以借鉴之处.谢谢“咕咕钟. 转自:http://guguclock.blogspot.c ...
- ElastAlert监控日志告警Web攻击行为
由于公司需要监控web攻击行为,而因某些原因搭不了waf,才不得不用ElastAlert进行告警,此为前提. 一.ELK安装 Elasticsearch 是一个分布式.可扩展.实时的搜索与数据分析引擎 ...
- spring-data-redis,jedis和redis主从集成和遇到的问题
Redis主从加哨兵的部署详见http://www.cnblogs.com/dupang/p/6414365.html spring-data-redis和jedis集成代码总体结构 代码地址http ...
- bzoj千题计划125:bzoj1037: [ZJOI2008]生日聚会Party
http://www.lydsy.com/JudgeOnline/problem.php?id=1037 一个区间是否满足 任意连续的一段,男孩与女孩的数目之差不超过k, 取决于男孩与女孩数目之差的最 ...