mysql分组后每组取前n条

时间:2022-07-17 15:08:37
#分组后每组取前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;