欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

分组排序函数——row_number()

程序员文章站 2022-08-19 23:41:39
1、MySQL8.0以上版本 用法1:无分组排序 Row_number() OVER(ORDER BY 字段 DESC)例如:Row_number() OVER(ORDER BY 学生成绩 DESC)表示不分班级,所有学生的成绩从高到低排序用法2:分组排序ROW_NUMBER() OVER(PART ......

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;