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 ...
随机推荐
- 工厂模式——(Head first设计模式4)
所谓工厂,肯定是和生产有关.工厂模式主要包括工厂方法模式和抽象工厂模式,有些人把简单工厂也作为一种模式,在本文我分别讨论简单工厂模式,工厂方法模式,抽象工厂模式.这些模式中同样也和生产有关.接下来,我 ...
- hibernate里联合主键composite-id映射,查询单个主键的问题
今天项目中遇到这个问题,搞了大半天,现在记录下来hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbW ...
- 汇编入门学习笔记 (九)—— call和ret
疯狂的暑假学习之 汇编入门学习笔记 (九)-- call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...
- R-tree 一种空间搜索的动态索引结构
译林:R-tree 一种空间搜索的动态索引结构Antonm Guttman 摘要为了有效地处理空间数据,正如在计算机辅助设计和地理数据应用中所要求的那样,数据库需要一种索引机制能根据它们的空间位置快速 ...
- JAVA String.format 方法使用介绍<转>
在JDK1.5中,String类增加了一个非常有用的静态函数format(String format, Objece... argues),可以将各类数据格式化为字符串并输出.其中format参数 ...
- java-基于Servlet3.0的文件上传
Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet3.0中使用request.getParts()获取上传文件
- MongoDB · 引擎特性 · MongoDB索引原理
MongoDB · 引擎特性 · MongoDB索引原理数据库内核月报原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引?当你抱怨Mong ...
- spring—Bean配置
Spring是一个开源的框架,其目标是简化java的开发.为了降低Java开发的复杂性,Spring有如下的特性: >> 基于POJO的轻量级和最小侵入性编程 >> 通过依赖注 ...
- Eclipse 中link一个异地的Folder
Eclipse 中link一个外地的Folder New -> Folder -> Click "Advanced" --> Check "Link t ...
- Windoows窗口程序一
编写窗口程序的步骤: .定义WinMain入口函数 .定义窗口处理函数(处理消息)WindowProc .注册窗口类RegisterClass .创建窗口(在内存中创建窗口)CreateWindow ...