SQL ROW_NUMBER() 的应用:分组之后再取前几行

  题目要求:  查询各科成绩前三名的记录

  有一下表,

  SC(S#,C#,Score)成绩表:S# 学号,C# 课程号,Score 分数.

  Course(C#,CName,T#) 课程:C# 课程号,CName 课程名称,T# 老师号.

 

   sql语句:

  Method1:

SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
      FROM SC t1
      WHERE score IN (SELECT TOP 3 score
              FROM SC
              WHERE t1.C#= C# 
            ORDER BY score DESC
              )
      ORDER BY t1.C#;

因为不同的课程号,可以对应相同的课程.按照这样的需求,上面的结果就有点问题.没有考虑到这种情况.

 

Method 2:

 

   SELECT S#,SCORE,CNAME FROM (
SELECT  SC.S#,SC.SCORE,CNAME,row_number() over (partition by CNAME ORDER BY SCORE DESC) AS ROWINDEX  FROM SC,COURSE C
WHERE SC.C#=C.C# 
GROUP BY SC.S#,SC.SCORE,CNAME) AS A
WHERE ROWINDEX<=3

 

这种方法考虑到了不同的课程号,对应相同的课程.其中用到了row_number 方法:

语法:

ROW_NUMBER()  OVER  ([<partition_by_clause>]  <order_by_clause>)

说明:返回结果集分区内行的序列号,每个分区的序列号从1开始.

备注: ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序.

参数:<partition_by_clause>:将FROM子句生长的结果集划入应用了ROW_NUMBER函数的分区.

       <order_by_clause>:确定将Row_Number值分配给分区中的行的顺序.

返回类型:bigint

 

----

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值