4000 mysql分组排序取最大、最小、最新、前N条记录
2018-03-08 11:11
495 查看
先看一下本示例中需要使用到的数据创建表并插入数据:
小编推荐使用第一、第三、第四钟方法,结果显示第1,3,4种方法效率相同,第2,5种方法效率差些。
原文地址:http://www.manongjc.com/article/1082.html
create table tb(name varchar(10),val int,memo varchar(20)) insert into tb values('a', 2, 'a2') insert into tb values('a', 1, 'a1') insert into tb values('a', 3, 'a3') insert into tb values('b', 1, 'b1') insert into tb values('b', 3, 'b3') insert into tb values('b', 2, 'b2') insert into tb values('b', 4, 'b4') insert into tb values('b', 5, 'b5')数据表如下:
name | val | memo |
a | 2 | a2 |
a | 1 | a1 |
a | 3 | a3 |
b | 1 | b1 |
b | 3 | b3 |
b | 2 | b2 |
b | 4 | b4 |
b | 5 | b5 |
按name分组取val最大的值所在行的数据
方法一:select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name方法二:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)方法三:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name方法四:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by方法五:
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name以上五种方法运行的结果均为如下所示:
name | val | memo |
a | 3 | a3 |
b | 5 | b5 |
按name分组取val最小的值所在行的数据
方法一:select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name方法二:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)方法三:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name方法四:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name方法五:
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name以上五种方法运行的结果均为如下所示:
name | val | memo |
a | 1 | a1 |
b | 1 | b1 |
按name分组取第一次出现的行所在的数据
sql如下:select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name结果如下:
name | val | memo |
a | 2 | a2 |
b | 1 | b1 |
按name分组随机取一条数据
sql如下:select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name结果如下:
name | val | memo |
a | 1 | a1 |
b | 3 | b3 |
按name分组取最小的两个(N个)val
第一种方法:select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val第二种方法:
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val第三种方法:
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name结果如下:
name | val | memo |
a | 1 | a1 |
a | 2 | a2 |
b | 1 | b1 |
b | 2 | b2 |
按name分组取最大的两个(N个)val
第一种方法:select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val第二种方法:
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val第三种方法:
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name结果如下:
name | val | memo |
a | 3 | a3 |
a | 2 | a2 |
b | 5 | b5 |
b | 4 | b4 |
相关文章推荐
- [MySQL]学习笔记- 用户行为表中,查询每个人的一条最新行为(分组 排序 取时间最大的一条记录)
- mysql查询获取分组后最新的一条记录,策略:先排序,然后在次分组查询(默认第一条),就是最新的一条数据了
- mysql 分组 排序 取时间最大的一条记录
- mysql 读取某个分组最大值,或最新记录的sql
- MySql 分组排序取时间最大的一条记录
- mysql 分组取最新的一条记录(整条记录)
- mysql查找重复记录中指定最大(最小)值
- Mysql按字段分组取最大值记录
- mysql分组查询取分组后各分组中的最新一条记录
- Mysql分组统计、排序、取前N条记录解决方案
- Mysql按字段分组取最大值记录
- oracle小记1--分组 排序 取最新时间记录
- [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
- [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
- Mysql分组统计、排序、取前N条记录解决方案
- mysql取出每个分组中最新的记录
- [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
- MySql按一个字段分组并且取另一个字段最大值的记录
- MySQL分组排序取前N条记录 以及 生成自动数字序列 的SQL
- Mysql按字段分组取最大值记录