--22、查询学生平均成绩及其名次
--这有个问题,如果有2个人同分,并且都排第1名,但是第3个人仍然是第2名,没有排到第3名,显示是不符实际的,应该是第3名了。
select
(select count(distinct 平均成绩) from (select sid,avg(score)as 平均成绩 from sc group by sid)as t1 where t1.平均成绩 >= t2.平均成绩)
as 名次,
sid as 学生学号,
平均成绩
from
(select sid,avg(score)as 平均成绩 from sc group by sid)as t2
order by 平均成绩 desc;
------解决思路----------------------
有现成函数RAN()可用啊。
WITH sc(sid,score) AS ( -- 测试数据做得简单点
SELECT 1,90 UNION ALL
SELECT 2,90 UNION ALL
SELECT 3,89
)
SELECT RANK() OVER(ORDER BY 平均成绩 DESC) AS 名次,
sid AS 学生学号,
平均成绩
FROM ( SELECT sid,
AVG(score) AS 平均成绩
FROM sc
GROUP BY sid
) AS t2
ORDER BY 名次,学生学号;
名次 学生学号 平均成绩
-------------------- ----------- -----------
1 1 90
1 2 90
3 3 89
------解决思路----------------------
用rank函数可以搞定
------解决思路----------------------
按需要选用 RANK() 或 DENSE_RANK()
WITH sc(sid,score) AS (
SELECT 1,90 UNION ALL
SELECT 2,90 UNION ALL
SELECT 3,89
)
SELECT RANK() OVER(ORDER BY 平均成绩 DESC) AS 名次1,
DENSE_RANK() OVER(ORDER BY 平均成绩 DESC) AS 名次2,
sid AS 学生学号,
平均成绩
FROM ( SELECT sid,
AVG(score) AS 平均成绩
FROM sc
GROUP BY sid
) AS t2
ORDER BY 名次1,学生学号;
名次1 名次2 学生学号 平均成绩
-------------------- -------------------- ----------- -----------
1 1 1 90
1 1 2 90
3 2 3 89