mysql 分組排序 高階版

2021-10-24 02:47:21 字數 1049 閱讀 2797

看過之前的部落格的應該知道有個曲線救國的方案--忽略

這裡發乙個基本近似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

mysql分組排序

sql的分組排序是乙個難點,在leetcode中是乙個hard級別的題目。筆者這兩天在工作中遇到了這麼乙個需求。取過去一段時間範圍內銷量前500的商品,然後取每個商品裡面銷量最高的sku,一共500個sku。取銷量前500的商品好求,但是這500對應的最高的sku不太容易,需要用到分組排序。筆者在工...

MySQL分組排序

emp資料表建表語句 create table emp empno int,ename varchar 40 job varchar 40 mgr int,hiredate varchar 40 sal double,comm int,deptno int 插入資料準備 insert into em...

Mysql實現分組排序

資料 studenno studentname classno classname 2018140101 張三1401 14級一班 2018140111 孫一1402 14級二班 2018140121 李二1402 14級二班 2018140102 錢一1401 14級一班 2018140104 趙...