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;