mysql5.7分组排序

工作中有需求,需要对表进行分组,然后取每组分数最高的那条数据。

查阅资料后发现有几种方法:
1:使用窗口函数

select rn,dept_no,salary
from(
select
dept_no,salary
ROW_NUMBER() OVER(partition by dept_no order by salary desc) as rn
from employee) a
where a.rn=1

根据dept_no分组,在分组内部根据 salary排序
由于mysql5.7 中没有窗口函数 ,所以无奈放弃。

2:使用group by 中limit

select a.dept_no,
any_value(a.salary)
from (
select dept_no,salary
from employee
order by salary desc
limit 1000) a
group by a.dept_no

由于mysql5.7中 默认sql_mode=only_full_group_by,取出来的非groupby列需要加 any_value函数, 而且 因为mysql 5.6之后版本对排序的sql解析做了优化,子查询中的排序是会被忽略的,所以上面的order by salary desc会失效,需要用limit来避免这种优化。然而limit数量是写死的可能会导致在数据量大的情况下数据丢失,实际使用可能考虑作为变量传进来。而且此写法只能满足获取第一条,如果想取第二名,第三名可能就无法满足需求了,因此不采用。

3:手动实现row_number()函数功能:

select * from (
select
@rn:= case when @dept_no = dept_no then @rn+1 else 1 end as rn,
@dept_no:=dept_no as dept_no,
salary
from(
select dept_no,salary
from employee
order by dept_no,salary desc
) a,(select @rn := 0,@dept_no := 0) b)a where rn=1

最终使用方法3

参考:
https://blog.csdn.net/Hu_1297/article/details/123800149
https://wenku.baidu.com/view/f2a821e58aeb172ded630b1c59eef8c75fbf95f4.html

https://blog.csdn.net/zhangyongze_z/article/details/108356347

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值