SQL分组取每组前一(或几)条记录(排名)

摘要:
--二、按name分组取val最小的值所在行的数据。代码如下:--方法1:selecta.*fromtbawhereval=orderbya.name--方法2:selecta.*fromtbawherenotexists--方法3:selecta.*fromtba,bwherea.name=b.nameanda.val=b.valorderbya.name--方法4:selecta.*fromtbainnerjoinbona.name=b.nameanda.val=b.valorderbya.name--方法5selecta.*fromtbawhere1˃orderbya.name/*namevalmemo-----------------------------------------a1a1--a的第一个值b1b1--b的第一个值*/--三、按name分组取第一次出现的行所在的数据。

mysql分组取每组前几条记录(排名) 附group by与order by的研究

http://www.jb51.net/article/31590.htm

--按某一字段分组取最大(小)值所在行的数据

代码如下:
/*
数据如下: 
name val memo 
a 2 a2(a的第二个值) 
a 1 a1--a的第一个值 
a 3 a3:a的第三个值 
b 1 b1--b的第一个值 
b 3 b3:b的第三个值 
b 2 b2b2b2b2 
b 4 b4b4 
b 5 b5b5b5b5b5 
*/ 

--创建表并插入数据:

代码如下:
create table tb(name varchar(10),val int,memo varchar(20)) 
insert into tb values('a', 2, 'a2(a的第二个值)') 
insert into tb values('a', 1, 'a1--a的第一个值') 
insert into tb values('a', 3, 'a3:a的第三个值') 
insert into tb values('b', 1, 'b1--b的第一个值') 
insert into tb values('b', 3, 'b3:b的第三个值') 
insert into tb values('b', 2, 'b2b2b2b2') 
insert into tb values('b', 4, 'b4b4') 
insert into tb values('b', 5, 'b5b5b5b5b5') 
go 

--一、按name分组取val最大的值所在行的数据。

代码如下:
--方法1:select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name 
--方法2: 
select a.* from tb a where not exists(select 1 from tb where name = a.name and val >a.val) 
--方法3: 
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 bya.name 
--方法4: 
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 bya.name 
--方法5 
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order bya.name 
/*
name val memo 
---------- ----------- -------------------- 
a 3 a3:a的第三个值 
b 5 b5b5b5b5b5 
*/ 

本人推荐使用1,3,4,结果显示1,3,4效率相同,2,5效率差些,不过我3,4效率相同毫无疑问,1就不一样了,想不搞了。

--二、按name分组取val最小的值所在行的数据。

代码如下:
--方法1:select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name 
--方法2: 
select a.* from tb a where not exists(select 1 from tb where name = a.name and val <a.val) 
--方法3: 
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 bya.name 
--方法4: 
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 bya.name 
--方法5 
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order bya.name 
/*
name val memo 
---------- ----------- -------------------- 
a 1 a1--a的第一个值 
b 1 b1--b的第一个值 
*/

--三、按name分组取第一次出现的行所在的数据。

代码如下:
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order bya.name 
/*
name val memo 
---------- ----------- -------------------- 
a 2 a2(a的第二个值) 
b 1 b1--b的第一个值 
*/ 

--四、按name分组随机取一条数据。

代码如下:
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--a的第一个值 
b 5 b5b5b5b5b5 
*/ 

--五、按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.valselect a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order bya.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 bya.name 
/*
name val memo 
---------- ----------- -------------------- 
a 1 a1--a的第一个值 
a 2 a2(a的第二个值) 
b 1 b1--b的第一个值 
b 2 b2b2b2b2 
*/ 

--六、按name分组取最大的两个(N个)val

代码如下:
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order bya.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 bya.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 bya.name 
/*
name val memo 
---------- ----------- -------------------- 
a 2 a2(a的第二个值) 
a 3 a3:a的第三个值 
b 4 b4b4 
b 5 b5b5b5b5b5 
*/ 

--七,假如整行数据有重复,所有的列都相同(例如下表中的第5,6两行数据完全相同)。
按name分组取最大的两个(N个)val

代码如下:
/*
数据如下: 
name val memo 
a 2 a2(a的第二个值) 
a 1 a1--a的第一个值 
a 1 a1--a的第一个值 
a 3 a3:a的第三个值 
a 3 a3:a的第三个值 
b 1 b1--b的第一个值 
b 3 b3:b的第三个值 
b 2 b2b2b2b2 
b 4 b4b4 
b 5 b5b5b5b5b5 
*/ 

免责声明:文章转载自《SQL分组取每组前一(或几)条记录(排名)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AutoMapper在项目中的应用keras使用word2vec pretrained vector注意事项下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

一些基本的Oracle命令

一些基本的Oracle命令基本命令 连接数据库 C:>SQLPLUS /NOLOG SQL>CONN / AS SYSDBA 1.Oracle 关闭 SQL>SHUTDOWN (ABORT|IMMEDIATE|NORMAL) 2.Oracle 启动 SQL>STARTUP (REMOUNT|MOUNT|OPENT) 3.SQL>...

form表单select联动(转)

下拉列表:二级联动菜单 Select对象的常用属性 options[]:返回所有option组成的一个数组; name:名称 value:option的value的值 length:设置或读取option的个数 selectedIndex:当前选中的option的索引号 option对象的常用属性 text:指<option></opti...

MySQL 中随机抽样:order by rand limit 的替代方案

  最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。       但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使...

mysql复杂查询(一)

所谓复杂查询,指涉及多个表、具有嵌套等复杂结构的查询。这里简要介绍典型的几种复杂查询格式。 一、连接查询 连接是区别关系与非关系系统的最重要的标志。通过连接运算符可以实现多个表查询。连接查询主要包括内连接、外连接等。 假设有Student和Grade两个表如下: +-----+--------+-------+ +-----+-----------...

数据库表数据如何去重

表结构为: 表数据为: 表中数据可以看到name列中有两行数据是一致的,去重的SQL语句为: 1 delete from user where name in (select name from (select name from user group by name having count(name) > 1) ass1) 2 and id...

[转]oracle在删除表表空间用户时,如何释放磁盘空间

一、drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉。这样,回收站里的表信息就可以被恢复,或彻底清除。 通过查询回收站user_recyclebin获取被删除的表信息,然后使用语句 flashback table...