首先是分组,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