2011-02-23 34 views
3

喜用一組前N行的SQL查詢我嘗試過很多辦法來解決這一點,但缺少一些東西.. 我有兩個表的學生和分數

Sid Cid Score 
6 1 90 
1 1 80 
4 1 80 
3 1 70 
2 1 60 
6 2 80 
1 2 70 
2 2 60 
4 2 60 
5 2 50 
4 3 80 
7 3 80 
6 3 70 
8 3 60 
2 3 50 

Sid Sname Sbday Ssex 
1 As 1980 female 
2 Al 1986 male 
3 An 1989 male 
4 ja 1986 male 
5 ma 1983 female 
6 phi 1986 male 
7 Geo 1993 male 
8 lil 1990 female 
9 cha 1993 male 

我需要回到希德和SNAME每門課程的成績排名前2的學生。 如果存在,則返回每個課程的所有男生中得分最高的學生的Sid和Sname。

這裏前兩名的得分最高的不僅僅是前兩名的記錄:前兩名的最高得分是90,80,80。

我需要出去把這樣

Sid Cid Score 
6 1 90 
1 1 80 
4 1 80 
6 2 80 
1 2 70 
2 2 60 
4 2 60 
4 3 80 
7 3 80 
6 3 70 

我嘗試下面的代碼:

select A.Sid , S.SNAME, Score,Cid 
    from Score a,STUDENTS S 
    where 2 >(select count(Cid) 
       from Score 
       where Cid=a.Cid 
       and Score>a.Score) 
    AND A.SID = S.SID 
    order by Cid,Score desc 

回答

5

對於第一個問題(列出誰對每門課程的前2位得分最高的學生),你應該試試這個:

SELECT SC.Sid , ST.SNAME, SC.Score, SC.Cid 
FROM ( SELECT *, DENSE_RANK() OVER(PARTITION BY Cid ORDER BY Score DESC) TopScore 
     FROM Score) AS SC 
INNER JOIN Students AS ST 
ON SC.Sid = ST.Sid 
WHERE SC.TopScore <= 2 

對於你的第二個佇列(學生誰得分最高所有男生爲每門課程),請執行以下操作:

SELECT A.Sid , A.SNAME, A.Score, A.Cid 
FROM ( SELECT SC.Sid , ST.SNAME, SC.Score, SC.Cid, DENSE_RANK() OVER(PARTITION BY Cid ORDER BY Score DESC) TopScore 
     FROM Score AS SC 
     INNER JOIN Students AS ST 
     ON SC.Sid = ST.Sid 
     WHERE ST.Ssex = 'male') A 
WHERE A.TopScore = 1 

希望它有幫助。

+0

非常感謝! ..我嘗試使用Rank()函數..我不知道Dense_Rank()..再次感謝.. – user630605 2011-02-23 17:49:30