mysql 分组排序--进阶版

看过之前的博客的应该知道有个曲线救国的方案--忽略

这里发一个基本近似row_number() over(partition by A order by B )的效果

先看效果,懂行的你应该看到玄机了:

发出完整sql:

select result.* from (  
select fa_tmp.famc,fa_tmp.jgbm,fa_tmp.khpl,fa_tmp.czsj,@rownum:=@rownum+1 rownum,  
if(@khpl=fa_tmp.khpl and @jgbm=fa_tmp.jgbm ,@rank:=@rank+1,@rank:=1) as rank,  
@khpl:=fa_tmp.khpl khpl_new ,@jgbm:=fa_tmp.jgbm jgbm_new
from (   
select fa.* from qyjx_khfa_jbxx  fa order by khpl desc, jgbm desc, czsj desc 
) fa_tmp ,(select @rownum :=0 ,@rank:=0, @khpl := null , @jgbm := null ) a ) result

以这个表qyjx_khfa_jbxx  为例,关注红色部分。

order by 排序字段是实际业务分组字段,其他自行理解下!

聪明的小伙伴应该发现一个其实这个更灵活,因为rank是自定义规则,可解决分组条件相同的情况:

比如:薪资相同排名并列的情况,简单介绍核心逻辑

if(@pdept=heyf_tmp.deptid AND @salary>=heyf_tmp.salary,@rank:=@rank+1,@rank:=1) as rank1, if(@pdept=heyf_tmp.deptid AND @salary=heyf_tmp.salary,@rank:=@rank-1,@rank) as rank,

用临时rank1过渡,如果相同恢复rank

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值