題目要求: 查詢各科成績前三名的記錄
有一下表,
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
----