列出每门学科排前三的学生姓名 (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,前面已经有很多前辈介绍过,这里我就不赘述了...

 

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

展开阅读全文

没有更多推荐了,返回首页