分组前n条记录
分组前n条记录
分组内的前n调记录。需要用到where查询,性能嘛,不清楚,估计不太高。where (select 统计计数)
SELECT
*
FROM
studentgrade a # 1 要查的表
WHERE # 外层的select遍历,带动着where内部的执行,所以,此时,a.grade已有固定值
(
SELECT
count(1) # 统计符合的数量
FROM
studentgrade b # 同样的一张表
WHERE
b.stbId = a.stbId # 在当前分类下查找
AND b.grade >= a.grade # b.grade >= 已查询到的a.grade
) <= 2 # 3 条件,即只能查到前n调
ORDER BY # 2 进行分组
a.stbId,
a.grade DESC;
转载地址: https://blog.csdn.net/junzi528/article/details/84404412
转载的,重点是说下自己的理解:
–需求:查询每门课程的前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
以下是我的个人理解:
SQL写法:
结果
理解:
核心思路:要算出某人成绩在第几名,可以转换成:算出他一共比多少人成绩高。比如,第一名的人,就没其它人成绩比他更好。第三名的人,就有两个人成绩比他好。
where语句可以理解为,把表中的每一行记录,都去与给定的where条件作对比,满足的再查出来。也就是有个遍历的过程。
模拟下SQL执行的过程就是,先取出外层a表的第一条记录
执行where中的子查询:
select count(1) from student_grade b where b.subId=1 and b.grade>=97
加粗的数据,即从外层a表取出来的。意思是课程1中,有多少个学生的成绩是大于等于97的?97已是最高分了,只有一个。因此满足外层的条件,小于等于2.
接下来取外层表第二条记录:
where子句变成了:
select count(1) from student_grade b where b.subId=1 and b.grade>=93
意思是课程1中,有多少个学生的成绩是大于等于93的?结果是2,因为97和93分都大于等于93分。因此满足外层的条件,小于等于2.这样就取出了每门课的前两名。
接下来取外层表第三条记录:
where子句变成了:
select count(1) from student_grade b where b.subId=1 and b.grade>=92
意思是课程1中,有多少个学生的成绩是大于等于92的?结果是3,因为97、93、92分都大于等于92分。因此不满足外层的条件,小于等于2.
以此类推…