sql 用Group by分組后,取每組的前幾條記錄


轉自:http://blog.163.com/jeson_lwj/blog/static/135761083201052411115783/

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

--結果
/*
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)
*/

共有三種方案,從難易程度上講我傾向於后兩種,從查詢邏輯思想上來講后兩種是一樣的

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

我是這樣理解的,看成兩張表A和B,條件為A表的學科=B表的學科,select count(1) from StudentGrade where subid=t.subid and grade>t.grade,返回A表的學科=B表的學科並且A表的成績小於B表的成績的影響行數,如果所影響的行數為零說明它的成績是最高的,如果等於1的話就是最高的兩個成績。這就是查詢條件,再按 subId,grade 排序。這種查詢思想很值得我學習

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM