mysql 分组取第N条记录

首先是分组,mysql支持rank() over (partition by xxx order by xxx)方式,可以通过该方式分区排序后取分组后的第N条记录,如下:

# 通过Name分组,通过Val排序,取每个分组中的第二条记录
select * from                                                                      
    (                                                                          
    select name,val,rank() over(partition by name order by val desc) mm from tab
   ) TT      
   WHERE TT.mm=2

当然了,如果不想使用分区(不建议使用分组group by排序取limit/top的主键),还是有其它相对高效的方式的,通过exists判断存在的数量,如下:

 # 通过name分组通过Val排序,取分组后val第二大的记录
 select a.* from tab a where exists (select 1 from tab b where name = a.name and val > a.val having Count(1) = 1) 
 # order by a.name
原文地址:https://www.cnblogs.com/lcawen/p/15419413.html