分组后取每组内排名的Top N的SQL语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分组后取每组内排名的Top N的SQL语句相关的知识,希望对你有一定的参考价值。

给个mysql例子参考 

-----查询每门课程的前2名成绩   

CREATE   TABLE   StudentGrade( 
stuId   CHAR(4),         --学号 
subId   INT,                 --课程号 
grade   INT,                 --成绩 
PRIMARY   KEY   (stuId,subId) 

GO 
--表中数据如下 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘001 ‘,1,97); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘001 ‘,2,50); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘001 ‘,3,70); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘002 ‘,1,92); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘002 ‘,2,80); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘002 ‘,3,30); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘003 ‘,1,93); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘003 ‘,2,95); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘003 ‘,3,85); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘004 ‘,1,73); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘004 ‘,2,78); 
INSERT   INTO   StudentGrade(stuId,subId,grade)   VALUES( ‘004 ‘,3,87); 
GO 
 
--查看数据 
select   *   from   StudentGrade 


--假如出现并列时,也只取两个同学的话。 
--方法一: 
select   distinct   * 
from   studentgrade   as   t1 
where   stuid   in 
(select   top   2   stuid 
  from   studentgrade   as   t2 
  where   t1.subid=t2.subid 
                  order   by   t2.grade   desc) 
order   by   subid,   grade   desc 

--方法二: 
select   *   from   StudentGrade   a   where   (select   count(1)   from   studentGrade   where   subId=a.subId   and   grade> =a.grade) <=2 

--方法三: 
select   *   from   StudentGrade   t 
where   (select   count(1)   from   StudentGrade   where   subid=t.subid   and   grade> t.grade) <=1 
order   by   subId,grade   desc 

--结果 
 

drop   table   StudentGrade

以上是关于分组后取每组内排名的Top N的SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 分组后取每组前N条数据

Oracle分组后取每组第一条

mysql分组后,取每组的前3条数据(并且有顺序)

sql分组后取每组前三

sql数据库怎么实现分组并取每组的前1条语句,按日期排序?

Mysql 分组以后取每组的前三名数据