分组排序函数——row_number()
1、mysql8.0以上版本
用法1:无分组排序
row_number() over(order by 字段 desc)
例如:row_number() over(order by 学生成绩 desc)
表示不分班级,所有学生的成绩从高到低排序
用法2:分组排序
row_number() over(partition by 字段1 order by 字段2 desc)
表示根据字段1分组,在分组内部根据字段2排序,这个函数计算的值就表示每组内部排序后的顺序编号
例如:row_number() over(partition by 班级 order by 学生成绩 desc)
表示根据“班级”分组,在每个“班级”内部根据“学生成绩”排序,这个函数计算的值就表示每组内部排序后的
顺序编号
解释:
row_number( ) 起到了编号的功能
partition by 将相同数据进行分区
order by 使得数据按一定顺序排序
2、mysql5.7版本
用法1:无分组排序
例如:计算销售人员的销售额,结果按从高到低排序,查询结果中要包含销售的排名
set @rank := 0;
select
a.*,
@rank := @rank + 1 as rank
from
( select sales_name, sum( sales ) from spm_order
group by sales_name
order by sum( sales ) desc ) a
用法2:分组排序
例:计算销售人员在不同城市的销售额;
要求:结果根据销售人员在不同城市的销售额进行分组排序(降序),并且查询结果要包含分组排名
set @r := 0,
@type := '';
select
@r :=
case when @type = a.sales_name then
@r + 1 else 1
end as rownum,
@type := a.sales_name as type,
a.*
from
( select sales_name, city, sum( sales ) from spm_order
group by sales_name, city
order by sales_name, sum( sales ) desc ) a;