34,587
社区成员
发帖
与我相关
我的任务
分享
create table table1(class varchar(10),sname varchar(10),grade int,primary key(class,sname))
insert into table1(class,sname,grade) values('c1','s1',90)
insert into table1(class,sname,grade) values('c1','s2',88)
insert into table1(class,sname,grade) values('c1','s3',91)
insert into table1(class,sname,grade) values('c2','s1',78)
insert into table1(class,sname,grade) values('c2','s2',89)
insert into table1(class,sname,grade) values('c2','s3',87)
insert into table1(class,sname,grade) values('c2','s4',79)
insert into table1(class,sname,grade) values('c2','s5',89)
go
select a.class,a.sname,a.grade
from table1 as a
inner join
(select b.class,max(b.grade) as maxgrade
from table1 as b
group by b.class) as c on a.grade=c.maxgrade
---
select *
from table1 a
where grade in (select max(b.grade) as maxgrade
from table1 as b
group by b.class)
select *
from table1 a
where not exists(select 1 from table1 where class = a.class and grade > a.grade)
drop table table1
create table table1(class varchar(10),sname varchar(10),grade int,primary key(class,sname))
insert into table1(class,sname,grade) values('c1','s1',90)
insert into table1(class,sname,grade) values('c1','s2',88)
insert into table1(class,sname,grade) values('c1','s3',91)
insert into table1(class,sname,grade) values('c2','s1',78)
insert into table1(class,sname,grade) values('c2','s2',89)
insert into table1(class,sname,grade) values('c2','s3',87)
insert into table1(class,sname,grade) values('c2','s4',79)
insert into table1(class,sname,grade) values('c2','s5',89)
go
--如果没有同分情况
--select t.* from table1 t where grade = (select (grade) from table1 where class = t.class)
--如果有同分情况
select m.* from table1 m,
((select class , max(grade) grade from table1 group by class)) n
where m.class = n.class and m.grade = n.grade
drop table table1
/*
class sname grade
---------- ---------- -----------
c1 s3 91
c2 s2 89
c2 s5 89
(所影响的行数为 3 行)
*/
--或者:
select * from t a where grade in (select max(grade) from t where class =a.class )
--或者:
select * from t a where (select count(distinct grade) from t where class =a.class and grade>=a.grade)=1
select * from table1 a where not exists(select 1 from table1 where class=a.class and
grade>a.grade)