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

 

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值