当前位置: 代码迷 >> Sql Server >> 代码 解读,该怎么处理
  详细解决方案

代码 解读,该怎么处理

热度:646   发布时间:2016-04-24 09:07:05.0
代码 解读

--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函数可以搞定
------解决思路----------------------
引用:
如果有2个人同分,并且都排第1名,但是第3个人仍然是第2名,没有排到第3名
——有些情况需要定它为第3名,有些情况需要定它为第2名(级) 

按需要选用 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
  相关解决方案