mysql分组后每组取前n条

#分组后每组取前n条
#取前每组前2个,有并列第二的则都取
如001学生有四门成绩90、80、70、60
下面条件子查询是在a中每取一组,取b中统计,看满足b中条件的是否<2
a.score b.score count
90 Na 0
80 90 1
70 90 2
70 80
60 90 3
60 80  
60 70   
可以看出符合条件的只有前两组


如果第二大的有重复,如90、80、80、60
a.score b.score count
90 Na 0
80 90 1
80 90 1
60 90 3
   80  
   80
可以看出符合条件的有三组


在有重复第二名的情况下,如果将查询中的<改为<=则

90 90 1
80 90 3
80 80
80 80
80 90 3
80 80
80 80
60 90 4
60 80  
60 80
60 60
结果只会得到一组数据
   
select  * FROM sc a  
where (select count(*) FROM sc b where b.sno=a.sno AND a.score<b.score  )<2
 ORDER BY sno asc,score desc;


#取前每组前2个,有并列第二的则不取
SELECT a.sno,a.score FROM sc a
LEFT JOIN sc b
ON a.sno=b.sno AND a.score<=b.score
GROUP BY a.sno,a.score
HAVING COUNT(a.sno)<=2
ORDER BY a.sno asc,a.score desc;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值