今天一个网友问我一个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,前面已经有很多前辈介绍过,这里我就不赘述了...
最后祝大家牛年更牛!...