lcawen

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

 

分类:

技术点:

相关文章:

  • 2022-01-01
  • 2021-11-18
  • 2022-01-01
  • 2022-01-01
  • 2021-05-25
  • 2021-11-18
  • 2021-04-29
  • 2022-01-01
猜你喜欢
  • 2022-01-01
  • 2021-11-18
  • 2021-10-14
  • 2022-01-01
  • 2022-01-01
  • 2022-01-01
  • 2022-01-01
相关资源
相似解决方案