sql分组后查找每组的前几条记录语句

原创 2016年06月01日 11:32:07

常用的sqlserver,mysql,oracle等数据库sql语句都是遵循sql标准,但是每种数据库都有自己的特点。

如果想做到程序兼容性更好,后期维护更方便,还是建议尽量使用各种数据库通用的sql语句(当然你也可以使用数据库独有特性)。

这里举个看似简单,缺难道不少人的例子:

分组查询每个班级分数前2名学生的记录

1.准备数据:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `NAME` varchar(10) default NULL,
  `class` varchar(20) default NULL,
  `score` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `test` VALUES ('1', '进一', '09-01', '299');
INSERT INTO `test` VALUES ('2', '虹二', '09-01', '259');
INSERT INTO `test` VALUES ('3', '张三', '09-01', '289');
INSERT INTO `test` VALUES ('4', '李四', '09-01', '277');
INSERT INTO `test` VALUES ('5', '张楚', '09-02', '287');
INSERT INTO `test` VALUES ('6', '小米', '09-02', '277');
INSERT INTO `test` VALUES ('7', '婷婷', '09-02', '257');
INSERT INTO `test` VALUES ('8', '月月', '09-02', '265');

2.查询分析
按class分组,然后取id靠前的两名,相信大多数人都能想到基本组合:
SELECT a.* FROM test a ORDER BY a.class, a.score;
注:sqlserver中可以用top n的写法,mysql中用limit 0 ,n,那么oracle中又得变了。
并且top0,n和Limit 0,n只能取到最前的n位,但如何能取到每个班的前n位呢,就无从下手了。
下面具体分析一下这题的解法:
获取每个class的前2位:
SELECT * FROM test a WHERE (SELECT COUNT(*) FROM test t WHERE t.class = a.class AND t.score > a.score) < 2;
遍历所有记录a,a.class
每条记录进行如下对比:
同班t,t.class=a.class 且分数比他高(score大于他)的记录的条数<2
(比他分数高的人的数量小于2;比他分数高的人有1个,他是第2名;比他分数高的人有0个,他是第1名;所以筛选出来的是前2名)
然后用该条记录与同班t中的所有记录比较,只有当班上t不超过两个人(含两个人)比该记录score高的话,该记录才被认定为该记录score排名前2,然后显示出来。






版权声明:本文为博主原创文章,未经博主允许不得转载。

Sql Server子查询、GROUP BY分组、having查询

1.子查询 语法:select ... from 表1 where 字段1 > (子查询语句) 例句:查看年龄比“李斯文”大的学员,要求显示学员信息; select * from stuinfo wh...
  • KingCruel
  • KingCruel
  • 2012年09月10日 08:00
  • 10004

SQL语句查询语句完整语法

数据库是mysql,使用的数据库表名称是my_student. 表的完整数据信息是: 完整语法是: Select [select选项] 字段列表[字段别名]/* from 数据源 [...
  • u011991249
  • u011991249
  • 2017年03月21日 21:28
  • 544

sql统计分组的组数

SELECT COUNT(*) from (SELECT * from enroll GROUP BY org_id) newtable; 例子 查询攻击的类别数 SELECT "count"(*...
  • klxk3
  • klxk3
  • 2017年06月26日 16:15
  • 1106

sql多表查询之分组查询

1.文章表如下: 2.回复表如下: 3.sql书写如下:
  • u014796999
  • u014796999
  • 2016年05月25日 15:42
  • 1852

SQL语句聚合函数、分组、子查询及组合查询

聚合函数: SQL中提供的聚合函数可以用来统计、求和、求最值等等。 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算...
  • LiMing_0820
  • LiMing_0820
  • 2017年01月08日 14:28
  • 778

SQL分组查询,子查询

1: 分组函数/又称聚集函数1.分组函数(默认情况下就是ALL)AVG (DISTINCT |ALL| n) COUNT (DISTINCT |ALL| expr | *) // NULL不计算,...
  • u013777351
  • u013777351
  • 2015年10月14日 19:26
  • 3752

SQL相关查询技术(有程序代码配合语句)

  • 2010年02月03日 17:03
  • 443KB
  • 下载

sql取出每个分组的前几条

转自:http://blog.csdn.net/yizhiduxiu11/archive/2009/01/16/3794577.aspx,向作者表示感谢!方法1:SELECT  newsid,titl...
  • zhichao2001
  • zhichao2001
  • 2010年12月10日 23:23
  • 7436

sql 分组后按时间降序排列再取出每组的第一条记录

竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记录 思路:通过aid分组,通过时间做降序排列,给每...
  • qq_16990363
  • qq_16990363
  • 2016年12月05日 16:17
  • 10098

SQL语句分组获取记录的第一条数据的方法

使用Northwind 数据库 首先查询Employees表 查询结果: city列里面只有5个城市 使用ROW_NUMBER() OVER(PARTITION BY COL1 ORDER...
  • swarb
  • swarb
  • 2014年04月11日 13:57
  • 1811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sql分组后查找每组的前几条记录语句
举报原因:
原因补充:

(最多只允许输入30个字)