列出每門學科排前三的學生姓名 (sql)

今天一個網友問我一個SQL查詢語句是怎麼寫的,因爲這個查詢可能在統計工資,統計分數的時候很有用,所以在這裏貼出來,也希望大蝦們有好的方法也貼出來.

題目是:列出每門學科排前三的學生姓名 (sql)(包含並列排名,意思是排名前三的學生不一定只有3個,有可能存在並列第二,並列第三的情況,這些學生都需要找出來)

既然題目都已經瞭解了,下面我貼代碼:

  1. CREATE TABLE tmp (nam varchar(10),lesson varchar(20),mark int)
  2. INSERT tmp (nam,lesson,mark) VALUES ('a1','c1',80)
  3. INSERT tmp (nam,lesson,mark) VALUES ('a2','c2',80)
  4. INSERT tmp (nam,lesson,mark) VALUES ('a3','c1',90)
  5. INSERT tmp (nam,lesson,mark) VALUES ('a4','c1',90)
  6. INSERT tmp (nam,lesson,mark) VALUES ('a5','c2',70)
  7. INSERT tmp (nam,lesson,mark) VALUES ('a6','c3',70)
  8. INSERT tmp (nam,lesson,mark) VALUES ('a7','c1',60)
  9. INSERT tmp (nam,lesson,mark) VALUES ('a8','c2',60)
  10. INSERT tmp (nam,lesson,mark) VALUES ('a9','c2',80)
  11. SELECT * FROM (SELECT dense_rank() OVER (partition BY lesson ORDER BY mark desc) AS id ,lesson,mark FROM tmp ) AS temp WHERE id<=3 ORDER BY lesson ,id 
  12. DROP TABLE tmp

運行結果:

 

1 c1 90
1 c1 90
2 c1 80
3 c1 60
1 c2 80
1 c2 80
2 c2 70
3 c2 60
1 c3 70

 

 

在此SQL中主要用到了dense_rank()和 over (partition by)結合分組查詢的功能,至於他們的具體用法,請大家參加MSDN或者CSDN,前面已經有很多前輩介紹過,這裏我就不贅述了...

 

最後祝大家牛年更牛!...

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