mysql8.0开始支持 row_number() over(partition by 分组列 order by 排序列 desc) 这种窗口函数,早期版本不支持,所以要实现分组排序只能自己写逻辑来实现。
- -- 1. @xx 设置变量
- -- 2. := 给变量赋值
- -- 假设需要对gc进行分组,然后在每个组内对oc进行降序排序
-
- -- 1. 窗口函数处理
- select t.*, row_number() over(partition by gc order by oc desc) As rank
- from table_name t
- ;
-
- -- 2. 变量方式实现
- select
- if(@gc = a.gc and @gc1 = a.gc1, @curRank := @curRank + 1, @curRank := 1) AS row_cnt,
- -- 注意这个计数项需要放在变量设置之前,这样第一次变量和实际dt、stu值不匹配,第一行的行序号会做成1,第二行开始匹配上了就自增了
- @gc := a.gc,
- @gc1 := a.gc1,
- -- 这里分组字段挨个设置
- oc
- from (select gc, gc1, oc from table_name order by gc, gc1, oc desc) a,
- (select @gc := null, @gc1 := null, @curRank := 0) temp
- ;