首先是分组,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
还有一种方式,是把列拼成分隔符分割的字符串(需要用到group),然后截取字符串内的第几个元素
#通过groupName 分组,通过sortfieldname排序,取第一个fieldName select substring_index(group_concat(fieldName order by sortfieldname),',',1) from tablename group by groupName