关于Oracle分组取最大值

时间:2021-12-11 15:11:08

先以一个淘宝的题目作为开始:

有一张表t_stu;其中三个字段:name,gender,grade;要求用一条sql语句查出男生前3名和女生前3名。

create table t_stu(name varchar2(100),sex varchar2(10),grade number);
--添加的测试数据如下
jack    boy    100
lili    girl    90
lucy    girl    98
tom    boy    99
lilei    boy    98
hanmeimei    girl    97
wang    boy    89
green    girl    88

立刻可以先排序,然后使用rownum选择出来,代码如下:

select * from (
select t.*,rownum as rid
from t_stu t
where sex = 'boy'
order by grade desc )
where rid <= 3
union 
select * from (
select t.*,rownum as rid
from t_stu t
where sex = 'girl'
order by grade desc )
where rid <= 3

 

如果我们的需求有变化,查询每个班级中的第一名的学生成绩,假设班级很多,要求使用group by 分组,那么该如何写出SQL语句呢。

 

扩展我们的t_stu表,增加一个班级字段,如下:

alter table t_stu add class varchar2(10);

 

--修改测试数据
jack    boy    100    1
lili    girl    90    1
lucy    girl    98    2
tom    boy    99    2
lilei    boy    98    3
hanmeimei    girl    97    3
wang    boy    89    4
green    girl    88    4