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
;