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

 

----

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章