取前幾名的例子

2021-04-02 21:51:53 字數 2492 閱讀 6327

------------------------------------

--給個例子參考

--查詢每門課程的前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

/*

要查詢每門課程的前2名成績

001 1 97

003 1 93

003 2 95

002 2 80

004 3 87

003 3 85

如何實現? */

--檢視資料

select * from studentgrade

------------------------------------

--假如出現並列時,就取多個同學的話。

--方法一:

select distinct *

from studentgrade as t1

where stuid in

(select top 2 with ties stuid

from studentgrade as t2

where t1.subid=t2.subid

order by t2.grade desc)

order by subid, grade desc

--方法二:

select * from studentgrade t where (select count(distinct grade) from studentgrade where subid=t.subid and grade>=t.grade)<=2

order by t.subid,t.grade desc

--方法三:

select * from studentgrade t

where (select count(distinct grade) from studentgrade where subid=t.subid and grade>t.grade)<=1

order by t.subid,t.grade desc

--結果 /*

stuid subid       grade      

----- ----------- -----------

001   1           97

003   1           93

003   2           95

002   2           80

004   3           87

003   3           85

(6 row(s) affected) */

drop table studentgrade

------------------------------------

--注:方法一,由於手頭沒有mssql,還沒有測試。方法二和方法三基本上是一樣的,只是對大於和大於等於的處理不同。

--注2:對有分數相同的,也只取兩個同學的方法,除了方法一裡去掉with ties外,還沒找到其他的方法

MySql分組取前幾名的寫法

1 準備測試資料 create table tb name varchar 10 val int,memo varchar 20 insert into tb values a 2,a2 a的第二個值 insert into tb values a 1,a1 a的第乙個值 insert into t...

mysql 取分組資料的前幾名(1)

目前有需求需要取分組資料的前幾名,有如下的解決方案來實現 具體資料庫如下 sql寫法 select from student grade as a where select coun from student grade as b where b.subid a.subid and b.grade ...

SQL查詢每門課程的前幾名

sql server查詢每門課程的前兩名的學生編號,課程編號,成績並排序。在sql server 資料庫中,有乙個表studentachievement 學生成績 它有三個字段 studentid varchar 8 學生編號 courseid varchar 10 課程編號 achievement...