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

 还有一种方式,是把列拼成分隔符分割的字符串(需要用到group),然后截取字符串内的第几个元素

#通过groupName 分组,通过sortfieldname排序,取第一个fieldName 
select substring_index(group_concat(fieldName order by sortfieldname),',',1) from tablename
group by groupName

 

posted @ 2021-10-18 10:08  lcawen  阅读(546)  评论(0)    收藏  举报