今天一個網友問我一個SQL查詢語句是怎麼寫的,因爲這個查詢可能在統計工資,統計分數的時候很有用,所以在這裏貼出來,也希望大蝦們有好的方法也貼出來.
題目是:列出每門學科排前三的學生姓名 (sql)(包含並列排名,意思是排名前三的學生不一定只有3個,有可能存在並列第二,並列第三的情況,這些學生都需要找出來)
既然題目都已經瞭解了,下面我貼代碼:
- CREATE TABLE tmp (nam varchar(10),lesson varchar(20),mark int)
- INSERT tmp (nam,lesson,mark) VALUES ('a1','c1',80)
- INSERT tmp (nam,lesson,mark) VALUES ('a2','c2',80)
- INSERT tmp (nam,lesson,mark) VALUES ('a3','c1',90)
- INSERT tmp (nam,lesson,mark) VALUES ('a4','c1',90)
- INSERT tmp (nam,lesson,mark) VALUES ('a5','c2',70)
- INSERT tmp (nam,lesson,mark) VALUES ('a6','c3',70)
- INSERT tmp (nam,lesson,mark) VALUES ('a7','c1',60)
- INSERT tmp (nam,lesson,mark) VALUES ('a8','c2',60)
- INSERT tmp (nam,lesson,mark) VALUES ('a9','c2',80)
- 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
- 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,前面已經有很多前輩介紹過,這裏我就不贅述了...
最後祝大家牛年更牛!...