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 分组查询 分组查询查询每组的前几条数据

sqlserver: select * from ( select *,row_number() over(partition by 分组列 order by 组内排序列) as rowNum fro...

【SQL】分组数据,过滤分组-group by , having

创建分组 - GROUP BY

SQL 数据库 学习 028 查询-11 having --- 对分组之后的信息进行过滤

我的电脑系统:Windows 10 64位 SQL Server 软件版本: SQL Server 2014 Express 本篇博客里面使用了 scott 库,如何你现在还没有添加这个库到你的服...

SQL分组查询,结果只取最新一条记录

select a.* from (select * from TABLE order by create_time desc) a group by a.user_id这里查询的是USER_ID相同的...

SqlServer查询分组后每个分组的第N条数据

select t.* from (select sc_oto_equi.*,row_number() over (partition by group_id order by group_id)...

如何用SQL SERVER取分组数据第一条

select b.* from (select a.*,row_number() over (partition by 列1 order by 列2 desc) rn  from a) b where...

sql取出每个分组的前几条

转自:http://blog.csdn.net/yizhiduxiu11/archive/2009/01/16/3794577.aspx,向作者表示感谢!方法1:SELECT  newsid,titl...

锋利的SQL:从分组中取前几行数据

这是在做一个考试成绩统计时遇到的问题。假设有如表1所示的数据,其中包含了3个班级的考生成绩,如果是希望获取全部数据的前2名,可以使用TOP配合ORDER BY子句轻易实现,但是如果我们希望取出每个...

sql server 分组,取每组的前几行数据

sql中group by或,获取每组中的前N行数据,目前我知道的有2种方法 比如有个成绩表: 里面有字段学生ID,科目,成绩。我现在想取每个科目的头三名。   1.   子查询 select * f...

MySql中取出每个分组中的前N条记录

需求是这样的(CSDN上的一个问题):mysql中有个表:article(字段:id,type,date),type有1-10,10种类型。现在要用SQL找出每种类型中时间最新的前N个数据组成的集合。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sql分组后查找每组的前几条记录语句
举报原因:
原因补充:

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