MySQL 分组后取每组前N条数据
与oracle的 rownumber() over(partition by xxx order by xxx )语句类似,即:对表分组后排序
创建测试emp表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
DROP TABLE IF EXISTS emp; CREATE TABLE emp ( empno decimal (4,0) NOT NULL , ename varchar (10) DEFAULT NULL , job varchar (9) DEFAULT NULL , mgr decimal (4,0) DEFAULT NULL , hiredate datetime DEFAULT NULL , sal decimal (7,2) DEFAULT NULL , comm decimal (7,2) DEFAULT NULL , deptno decimal (2,0) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of emp -- ---------------------------- INSERT INTO emp VALUES ( '7369' , 'SMITH' , 'CLERK' , '7902' , '1980-12-17 00:00:00' , '800.00' , null , '20' ); INSERT INTO emp VALUES ( '7499' , 'ALLEN' , 'SALESMAN' , '7698' , '1981-02-20 00:00:00' , '1600.00' , '300.00' , '30' ); INSERT INTO emp VALUES ( '7521' , 'WARD' , 'SALESMAN' , '7698' , '1981-02-22 00:00:00' , '1250.00' , '500.00' , '30' ); INSERT INTO emp VALUES ( '7566' , 'JONES' , 'MANAGER' , '7839' , '1981-04-02 00:00:00' , '2975.00' , null , '20' ); INSERT INTO emp VALUES ( '7654' , 'MARTIN' , 'SALESMAN' , '7698' , '1981-09-28 00:00:00' , '1250.00' , '1400.00' , '30' ); INSERT INTO emp VALUES ( '7698' , 'BLAKE' , 'MANAGER' , '7839' , '1981-05-01 00:00:00' , '2850.00' , null , '30' ); INSERT INTO emp VALUES ( '7782' , 'CLARK' , 'MANAGER' , '7839' , '1981-06-09 00:00:00' , '2450.00' , null , '10' ); INSERT INTO emp VALUES ( '7788' , 'SCOTT' , 'ANALYST' , '7566' , '1982-12-09 00:00:00' , '3000.00' , null , '20' ); INSERT INTO emp VALUES ( '7839' , 'KING' , 'PRESIDENT' , null , '1981-11-17 00:00:00' , '5000.00' , null , '10' ); INSERT INTO emp VALUES ( '7844' , 'TURNER' , 'SALESMAN' , '7698' , '1981-09-08 00:00:00' , '1500.00' , '0.00' , '30' ); INSERT INTO emp VALUES ( '7876' , 'ADAMS' , 'CLERK' , '7788' , '1983-01-12 00:00:00' , '1100.00' , null , '20' ); INSERT INTO emp VALUES ( '7900' , 'JAMES' , 'CLERK' , '7698' , '1981-12-03 00:00:00' , '950.00' , null , '30' ); INSERT INTO emp VALUES ( '7902' , 'FORD' , 'ANALYST' , '7566' , '1981-12-03 00:00:00' , '3000.00' , null , '20' ); INSERT INTO emp VALUES ( '7934' , 'MILLER' , 'CLERK' , '7782' , '1982-01-23 00:00:00' , '1300.00' , null , '10' ); |
需求:按部门分组后显示工资为前三的员工信息
SQL:
1
|
select * from emp as a where 3> ( select count (*) from emp where deptno = a.deptno and sal < a.sal ) order by a.deptno ,a.sal |
解析SQL:
3>...
目的是获取前三条数据,可以多次修改
emp where deptno = a.deptno
目的是确定分组字段
sal < a.sal
排序条件
结果图:
zhuanzi https://www.cnblogs.com/duyunchao-2261/p/7460294.html
MySQL 分组后取每组前N条数据的更多相关文章
- SQL分组排序后取每组最新一条数据的另一种思路
在hibernate框架和mysql.oracle两种数据库兼容的项目中实现查询每个id最新更新的一条数据. 之前工作中一直用的mybatis+oracle数据库这种,一般写这类分组排序取每组最新一条 ...
- 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录
开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...
- mysql 分组后取每个组内最新的一条数据
首先,将按条件查询并排序的结果查询出来. mysql order by accepttime desc; +---------------------+------+-----+ | acceptti ...
- mysql单列去重复group by分组取每组前几条记录加order by排序
mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...
- MSSQL 分组后取每组第一条(group by order by)
查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...
- SQL获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)
获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...
- oracle分组后取某组中最大的值
查询username,根据fundcode分组,按照date倒序,取date最大的一条数据 select * from ( select username, row_number() over(par ...
- Oracle分组后取某列最大值的行数据
select * from ( select last_comment, row_number() over(partition by employeeid,roadline,stationname ...
- Mysql SQL分组取每组前几条记录
按name分组取最大的两个val: [比当前记录val大的条数]小于2条:即当前记录为为分组中的前两条 > (select count(*) from tb where name = a.nam ...
随机推荐
- Sqli-LABS通关笔录-5[SQL布尔型盲注]
/* 请为原作者打个标记.出自:珍惜少年时 */ 通过该关卡的学习我掌握到了 1.如何灵活的运用mysql里的MID.ASCII.length.等函数 2.布尔型盲注的认识 3.哦,对了还有.程序 ...
- jQuery插件 -- 表单验证插件jquery.validate.js
最常使用JavaScript的场合就是表单的验证,而jQuery作为一个优秀的JavaScript库,也提供了一个优秀的表单验证插件----Validation.Validation是历史最悠久的jQ ...
- android矩阵具体解释
Matrix.中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成.是一个3*3的矩阵. 最好记住.例如以 ...
- 百度地图Api进阶教程-基础地图示例1.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- JSON教程
一.什么是JSON 1.JSON指的是JavaScript对象表示法(JavaScript Object Notation). 2.JSON是轻量级的文本数据交换格式,比XML更小.更快.更易解析. ...
- Ajax-java中的ajax使用,以及编码问题
结合Ajax类使用:http://www.cnblogs.com/hfultrastrong/p/7267171.html javascript代码: <script type="te ...
- 专题实验 Storage structure 物理存储
物理存储结构主要是指: extent的分配, 以及datablock 存储相关, 置于tablespace, segment 都是逻辑结构. tablespace : 逻辑结构, 没有实际物理存储. ...
- 成员函数后面加const,没有const,以及使用的区别
函数后面加const 编译器会自动给每一个函数加一个this指针.在一个类的函数后面加上const后,就表明这个函数是不能改变类的成员变量的(加了mutable修饰的除外,后面有讲).实际上,也就是对 ...
- Hbase Rowkey设计
转自:http://www.bcmeng.com/hbase-rowkey/ 建立Schema Hbase 模式建立或更新可以通过 Hbase shell 工具或者使用Hbase Java API 中 ...
- 关于Cocos2d-x手机上运行游戏的时候屏幕横屏改竖屏的解决方案
cocos2d-x打包的时候默认是横屏,如果要改成竖屏,步骤如下: 1.打开项目 2.打开proj.android 3.编辑AndroidManifest.xml 4. 找到这一句android:sc ...