SQL分组取每组前一(或几)条记录(排名)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQL分组取每组前一(或几)条记录(排名),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4587字,纯文字阅读大概需要7分钟。
内容图文
![SQL分组取每组前一(或几)条记录(排名)](/upload/InfoBanner/zyjiaocheng/486/cffd91101c824099aaf80dcf80b7f09d.jpg)
/* 数据如下: 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 by a.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 by a.name --方法5 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: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 by a.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 by a.name --方法5 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--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 a.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 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的第一个值 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 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 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分组取每组前一(或几)条记录(排名)
标签:create min 插入数据 class desc 最小 sel post too
本文系统来源:http://www.cnblogs.com/footleg/p/7133087.html
内容总结
以上是互联网集市为您收集整理的SQL分组取每组前一(或几)条记录(排名)全部内容,希望文章能够帮你解决SQL分组取每组前一(或几)条记录(排名)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。